interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a)
ユースケースのようなタイプの署名で、ソースに対する非決定性インターリーブ動作を確認するために期待していたが、私は上の多くのノードへのオープン接続を維持してP2Pアプリケーションを持っているということですほとんどの場合、それらのいずれかからのメッセージを待っているだけです。メッセージが到着すると、メッセージはどこから来たかに関わらず、できるだけ早くメッセージを処理する必要があります。理論的には、この種のアプリケーションは少なくともGHCのIOマネージャをバイパスしてselect
/epoll
/etcを実行することができます。直接呼びますが、動作している限り、その実装方法は特に気にしません。
これはコンジットでも可能ですか?それほど一般的ではありませんが、おそらくもっと実現可能な方法は、すべてのソケットでの受信を処理する[(k, Socket)] -> Source m (k, ByteString)
関数を書くことです。
私はコンジットでResumableSource
の操作を気付いたが、少なくともこの操作では少しの抽象リークのような感じの特定のSink
を知りたいと思うようだ。
ChIO/TChanを包むソースとフォークを使用する単純なソリューションよりも、どれくらいのスピードが必要ですか? –
私は必ずしも高性能が必要なわけではありません(私は、最大で約1000人のピアに接続することを期待しています)。しかし、私はこれらのiterateeのような抽象概念にも一般的に興味があり、この種の操作導管でこれは、特定の種類のネットワークプロトコルにとっては合理的に一般的な使用例のようです。 – copumpkin
私は、イベントマネージャーが、 'select'や' epoll'を直接またはパッケージを通して使用することなく、あなたが得られるほど近くにいると信じています。私はイベントマネージャからポーリングインターフェイスが露出しているとは思えません(もしそうなら、イベントマネージャはあまりありません)ので、ほとんどのデザインのスレッドやチャンにいくつかの結果が残るでしょう。私がしたいのは、最初に接続ごとにスレッドをフォークする、 'ソース'がバインドされた 'TChan'をラップすることです。パフォーマンスが必要な場合は、イベントマネージャーに移動します。それでも問題が解決しない場合は、常にFFIがあります。 –