Tôi đã hy vọng để xem một hoạt động interleaving không xác định cho nguồn khác nhau, với một loại chữ ký nhưNondeterministically interleaving ống dẫn của
interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a)
Các trường hợp sử dụng là tôi có một ứng dụng p2p duy trì các kết nối mở rộng cho nhiều nút trên mạng, và nó chủ yếu chỉ là ngồi xung quanh chờ đợi tin nhắn từ bất kỳ người trong số họ. Khi một tin nhắn đến, nó không quan tâm nó đến từ đâu, nhưng cần xử lý tin nhắn càng sớm càng tốt. Về lý thuyết loại ứng dụng này (ít nhất là khi được sử dụng cho các nguồn giống như socket) có thể bỏ qua toàn bộ trình quản lý IO của GHC và chạy select
/epoll
/etc. gọi trực tiếp, nhưng tôi không đặc biệt quan tâm đến cách nó được triển khai, miễn là nó hoạt động.
Có phải thứ như thế này có thể có ống dẫn không? Một cách tiếp cận ít tổng quát hơn nhưng có lẽ khả thi hơn có thể là viết một hàm [(k, Socket)] -> Source m (k, ByteString)
xử lý việc nhận trên tất cả các ổ cắm cho bạn.
Tôi nhận thấy các hoạt động ResumableSource
trong ống dẫn, nhưng tất cả dường như muốn biết về một số Sink
cụ thể, cảm giác như một chút rò rỉ trừu tượng, ít nhất là cho hoạt động này.
Bạn cần bao nhiêu perf nhanh hơn giải pháp đơn giản khi sử dụng forkIO và Nguồn gói Chan/TChan? –
Tôi không nhất thiết cần hiệu suất cao (tôi dự đoán kết nối với khoảng 1000 trong số các đồng nghiệp này nhiều nhất) nhưng tôi cũng chỉ quan tâm đến những trừu tượng giống như iteratee này và tự hỏi liệu có thể cung cấp loại hoạt động này hay không với ống dẫn. Nó có vẻ giống như một trường hợp sử dụng hợp lý cho một số loại giao thức mạng nhất định. – copumpkin
Tôi tin rằng trình quản lý sự kiện gần giống như bạn sẽ nhận được mà không sử dụng 'select' hoặc 'epoll' trực tiếp hoặc thông qua một số gói. Tôi không nghĩ rằng có một giao diện bỏ phiếu tiếp xúc từ người quản lý sự kiện (nó sẽ không được nhiều người quản lý sự kiện nếu nó đã làm) vì vậy bạn sẽ kết thúc với một số chủ đề và chans với hầu hết các thiết kế anyways. Những gì tôi muốn làm là bắt đầu với một 'Source' gói một' TChan' bị ràng buộc, giả định một luồng cho mỗi kết nối ban đầu. Di chuyển đến trình quản lý sự kiện nếu cần thiết cho hiệu suất.Nếu bạn vẫn gặp vấn đề thì luôn có FFI. –