2013-02-11 30 views
6

Tôi đang viết một Máy chủ trong Haskell và tôi muốn đóng một cách rõ ràng một máy khách Xử lý sau khi chúng ngắt kết nối. Khi tôi gọi hClose, luồng sẽ chặn cho đến khi Khách hàng đóng bên cạnh tay cầm. Có cách nào để kết thúc mà không chặn không?Haskell hĐóng ngăn chặn

Cảm ơn trước!

+0

Khởi chạy không đồng bộ? Xem http://hackage.haskell.org/packages/archive/async/2.0.1.4/doc/html/Control-Concurrent-Async.html – jozefg

+2

Tôi khuyên bạn nên sử dụng một số thư viện cấp cao như [ống dẫn] (http://hackage.haskell.org/package/conduit). Nó sẽ xử lý tất cả các công cụ cấp thấp này cho bạn và bạn có thể tập trung vào việc thực hiện logic ứng dụng thực tế. –

Trả lời

10

Chắc chắn, chỉ cần chạy nó trong chủ đề khác:

import Control.Concurrent (forkIO) 

forkIO (hClose handle) 

Như jozefg đã tuyên bố, bạn có thể sử dụng giải pháp fancier như những mặt hàng trong async, nhưng tôi không thấy có lý do để trong trường hợp này.

+0

Điều này không, tất nhiên, bỏ chặn bất kỳ chủ đề bị chặn trên đọc từ xử lý có liên quan. Một giải pháp nào đó bỏ cấm người đọc đúng cách là sử dụng các chức năng để đọc từ ổ cắm trong Network.Socket, nhưng điều đó có đau đầu của riêng nó ... Vui như thế nào tự mô tả giao diện cấp thấp hoạt động đúng với các chủ đề nhưng cấp cao hơn không ... – javawizard