2012-09-13 38 views
5

Cách được chấp nhận chung để thực hiện vòng lặp chính của máy chủ cần phải chờ đợi trên một tập hợp sự kiện không đồng nhất là gì? Đó là máy chủ nên chờ đợi (không busywait) cho đến khi một trong những điều sau đây xảy ra:Thực hiện vòng lặp máy chủ chính trong Haskell?

  • socket mới kết nối
  • dữ liệu có sẵn trên một ổ cắm hiện
  • tín hiệu OS
  • callbacks thư viện của bên thứ ba

Trả lời

6

Tôi nghĩ bạn đang suy nghĩ về một mô hình C với một chuỗi duy nhất, không chặn I/O và một cuộc gọi select().

Bạn có thể quản lý để viết một cái gì đó như thế trong Haskell, nhưng Haskell có nhiều hơn nữa để cung cấp:

Tôi khuyên bạn nên ngã ba một chủ đề mới cho mỗi điểm riêng biệt của liên hệ với wit h thế giới bên ngoài, và giữ mọi thứ phối hợp với STM.

2

Sử dụng takeMVarputMVar để đồng bộ hóa giữa các chuỗi. Họ thường chặn các chủ đề nếu hoạt động không được phép. Đọc ghc docs.

+1

Hoặc 'Chan'. Tôi thực sự thích 'Chan'. – singpolyma

1

Tôi muốn làm rõ, tôi nghĩ hai giải pháp được đăng đầu tiên tốt hơn giải pháp này cho vấn đề cụ thể mà bạn có, nhưng đây là cách để giải quyết loại vấn đề bạn đã trình bày.

Một cách đơn giản vòng này là để có các định nghĩa của bạn như

data SocketConn = .... 
data DataAvail = ... 
data OSSignal = ... 
data Callback = ... 

và xác định phiên bản unsimplified của

data ServerEvent = Sok SocketConn | Dat DataAvail | Sig OSSignal | Call Callback 

handleEvent :: ServerEvent -> IO() 
handleEvent (Soc s) = .... 
handleEvent (Dat d) = .... 
handleEvent (Sig o) = .... 
handleEvent (Call c) = .... 

Giống như tôi đã nói, đọc lên trên câu trả lời khác!

+1

Bạn không nên giải mã câu trả lời này quá nhiều; đó là cách hợp pháp để làm mọi thứ. Và nó * không * trả lời câu hỏi khái quát cơ bản, đó là, "làm thế nào để xử lý khả năng hình dạng đầu vào khác nhau mà tất cả đi vào cùng một khe?". Câu trả lời là "sử dụng một công đoàn được gắn thẻ", như bạn đã đề xuất. –

+0

@DanBurton OK, tôi đã giảm bớt "không làm điều này" để "các giải pháp khác là tốt hơn cho vấn đề cụ thể của bạn" – AndrewC

0

Bộ nhớ giao dịch phần mềm (STM) là cách chính để thực hiện chờ đợi nhiều chiều.

Tuy nhiên, do ngoại hình của mọi thứ, trong trường hợp của bạn, bạn có thể chỉ muốn sinh ra một chuỗi Haskell riêng biệt cho mỗi tác vụ và để cho mỗi chuỗi chuỗi đó trong khi không có gì xảy ra.

Bạn sẽ không muốn tạo một nghìn chủ đề hệ điều hành, nhưng một nghìn chủ đề Haskell không có vấn đề gì cả.

(Nếu những chủ đề cần phải phối hợp trong từng thời kỳ, sau đó một lần nữa, STM có lẽ là cách đơn giản nhất đáng tin cậy nhất để làm điều đó.)

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