2013-04-04 30 views
5

Tôi đã đọc bài viết Beautiful Concurrency về Haskell và STM.Haskell đồng thời và kiên trì

Ví dụ được đưa ra là chuyển khoản ngân hàng.

Chuyển khoản ngân hàng của nó - giữa hai số nằm trong bộ nhớ heap.

Những câu hỏi này ngay lập tức đặt ra trong đầu tôi là:

  1. cách chuyển mà nguyên tử lượt truy cập đĩa. Cho đến khi một giao dịch ngân hàng được ghi lại một cách liên tục - ACID - cách thức, nó đã không xảy ra trong cuốn sách của tôi. Làm cách nào để mọi người sử dụng các ngôn ngữ như Haskell - điều này sẽ không cho phép bạn thực hiện bất kỳ IO nào bên trong STM - thực sự thực sự làm thay đổi nguyên tử trong dữ liệu không chỉ trong bộ nhớ dễ bay hơi?

  2. cách phân phối trên nhiều máy; làm thế nào bạn có thể có các giao dịch phân tán và một ứng dụng mở rộng quy mô (không có IO bên trong STM)?

+0

Như câu trả lời ngụ ý tôi nghĩ rằng ví dụ ngân hàng được cho là được hiểu như một phép ẩn dụ – jberryman

+0

@ jberryman vì vậy nó có ích gì cho lúc đó? Điều gì sẽ là một vấn đề đại diện hơn? Dưới đây, chúng tôi có hai câu trả lời và ý kiến ​​của một bài nói về stm-io-hooks đề xuất 1) stm có thể làm việc với io và 2) điều này không được biết đến nhiều trong cộng đồng haskell, hoặc 3) một lỗ hổng trong đó đã không được tiếp xúc ở đây được nêu ra ... – Will

+0

STM là hữu ích khi bạn có concurrency và thực hiện những gì bạn muốn với ổ khóa là không tầm thường. Tôi nghĩ bạn có thể nhận được một số câu trả lời thực sự thú vị nếu câu hỏi của bạn tập trung hơn. – jberryman

Trả lời

7

Làm thế nào để những người sử dụng ngôn ngữ như Haskell - mà sẽ không cho phép bạn làm bất cứ IO bên trong một STM - thực sự thực sự làm thay đổi nguyên tử trong dữ liệu đó là không chỉ trong bộ nhớ không ổn định?

Thông qua thư viện trong IO hoặc loại hiệu ứng tương tự. Ví dụ. ACID hoặc "MACID" hệ thống.

cách phân phối trên nhiều máy; làm thế nào bạn có thể có các giao dịch phân tán và một ứng dụng mở rộng quy mô (không có IO bên trong STM)?

Tôi không biết về triển khai STM được phân phối cho Haskell, tuy nhiên Cloud Haskell là mô hình lập trình phân tán cho GHC.

+0

cho (1) bạn có nghĩa là họ không sử dụng STM?Khóa cổ điển trong thư viện IO có thay thế không? – Will

+1

STM trong bộ nhớ của GHC được sử dụng cho một số thư viện dựa trên đĩa. Đôi khi các thư viện tự thực hiện ngữ nghĩa giao dịch (ví dụ: cơ sở dữ liệu). http://hackage.haskell.org/package/stm-io-hooks –

9

STM được thiết kế để đồng bộ hóa luồng và liên lạc, không phải để lưu trữ dữ liệu liên tục. Nói cách khác, STM được thiết kế để cho phép các luồng chia sẻ dữ liệu giữa chúng mà không bị deadlocks hoặc các điều kiện chủng tộc. Hoặc cho các chủ đề để gửi tín hiệu cho nhau. Hoặc về cơ bản để điều phối các hoạt động của luồng.

Nếu bạn muốn liên tục dữ liệu được lưu trữ trên đĩa, hãy sử dụng cơ sở dữ liệu. MySQL, PostgreSQL, Oracle, v.v. Có một triệu để lựa chọn. Đây không phải là vấn đề mà STM được thiết kế để giải quyết.

Đối với phân phối đang xử lý ... chúng tôi vẫn đang làm việc trên đó. Tôi không làm theo những điều này đủ chặt chẽ để bình luận về việc nó gần như thế nào để trở thành hiện thực.

+0

Trường hợp này đứng với liên kết của Don để stm-io-móc? – Will

Các vấn đề liên quan