2012-07-14 2 views
5

私は非決定的インタリーブ導管のソース

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を知りたいと思うようだ。

+0

ChIO/TChanを包むソースとフォークを使用する単純なソリューションよりも、どれくらいのスピードが必要ですか? –

+0

私は必ずしも高性能が必要なわけではありません(私は、最大で約1000人のピアに接続することを期待しています)。しかし、私はこれらのiterateeのような抽象概念にも一般的に興味があり、この種の操作導管でこれは、特定の種類のネットワークプロトコルにとっては合理的に一般的な使用例のようです。 – copumpkin

+0

私は、イベントマネージャーが、 'select'や' epoll'を直接またはパッケージを通して使用することなく、あなたが得られるほど近くにいると信じています。私はイベントマネージャからポーリングインターフェイスが露出しているとは思えません(もしそうなら、イベントマネージャはあまりありません)ので、ほとんどのデザインのスレッドやチャンにいくつかの結果が残るでしょう。私がしたいのは、最初に接続ごとにスレッドをフォークする、 'ソース'がバインドされた 'TChan'をラップすることです。パフォーマンスが必要な場合は、イベントマネージャーに移動します。それでも問題が解決しない場合は、常にFFIがあります。 –

答えて

5

stm-conduitパッケージは、あなたが探しているものと同じではありませんが、類似のものを実行するmergeSourcesを提供します。それはおそらく始めるのに良い場所です。

+1

マイケルの答えを受け入れる。それは私が記述したことをする。 –

+0

'mergeSources'の型が' MonadResource'インスタンスの代わりに 'ResourceT m'の形式になっている' Source'のモナド引数を制約する理由を詳しく説明できますか? –

+1

理由がわかりません。メンテナに問題を提出する価値があります。 'hoist liftResourceT'を使って' mergeSources'を呼び出すときに、これを修正することができます。 –

3

はい、可能です。

あなたは、各スレッドにあなたには、いくつかの並行処理チャネルに出力を送信SinkとまでSourceをペア場所をポーリングするスレッドをフォークからブロックされることなく、Source Sの束をポーリングすることができます

concur :: (WhateverIOMonadClassItWouldWant m) => TChan a -> Sink a m r 

...その後、あなたはそのチャンネルから読み取っSourceを定義します。

これは単なるソケット自体をポーリングするスレッドをフォークの違いはなく、それだろうと
synchronize :: (WhateverIOMonadClassItWouldWant m) => TChan a -> Source a m r 

お知らせもっと一般的であるため、conduitSourceを使ってソケット以外のものをポーリングしたいかもしれない他のユーザーにとっては役に立ちます。

使用すると、1つの関数にこれらの機能を組み合わせる場合は、コールの全体的なAPIは次のようになります:

poll :: (WhateverIOMonadClassItWouldWant m) => [Source a m r] -> m (Source a m r) 

...しかし、あなたが望むなら、あなたはまだ、これらのk秒で投げることができます。

関連する問題