問題タブ [producer-consumer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - POSIX スレッドを使用してブロッキング読み取りを実装する方法
おおよそのインターフェースに従う生産者/消費者シナリオを実装したいと思います。
この場合、feed
とrun
は別々のスレッドで実行されread
、ブロッキング読み取り (recv
と などfread
) である必要があります。明らかに、deque である種の相互排除が必要にread
なります。また、再試行を通知する何らかの通知システムが必要です。
条件変数が最適だと聞きましたが、マルチスレッドの経験はすべて Windows にあり、それらについて頭を悩ませています。
助けてくれてありがとう!
(はい、ベクトルを返すのは非効率的であることはわかっています。それには立ち入りません。)
producer-consumer - プロデューサーが完了したときにコンシューマーに通知する
データベース内のそれぞれのレコードと比較する必要があるldapから多くのデータを読み込んでいます。SQL クエリの数を最小限に抑えるために、複数の LDAP レコードを 1 つのクエリにバッチ処理したいと考えています。
これはすべて非常に単純です。LDAP の結果を生成するスレッドと、それらの結果を使用して SQL クエリを実行するスレッドです。
問題は次のとおりです。ldap が返す結果が 3 つだけで、結果buffer_size
が 5 の場合、永久にブロックされてしまいます。None
、 またはなどの特別なトークンをバッファに入れることができることは"EOF"
わかっていますが、それは悪い設計のように思えます。
私は2つの代替案を思いつきました。1つ目は共有eof
変数を持つことですが、それを適切に同期する方法がわかりません。
2 つ目はProduceChunks(chunk_size)
プロデューサー用のメソッドを用意することで、結果のバッチ処理を処理しますが、私はそれが好きではありません。消費者の責任です。
誰にもガイダンスはありますか?
objective-c - NSMutableData から読み取る NSInputStream で NSStreamEventEndEncountered を通知する方法
Cocoa では、2 つの NSThreads、1 つのプロデューサーと 1 つのコンシューマーをセットアップしました。プロデューサは NSMutableData にデータを追加し、レシーバはそのデータから NSInputStream を開き、チャンクを読み取ります。
プロデューサー スレッドは、コンシューマー プロセスよりもはるかに高速に書き込みますが、これは問題ありません。しかし、プロデューサーは限られた量の作業しか生成せず、終了します。コンシューマ スレッドが NSStreamEventEndEncountered イベントを処理するようにしたいと思います。NSInputStream が NSMutableData からのものである場合、これをどのように通知できますか?
ストリームの終わりを示す魔法の数字を含む一連のバイトをプロデューサーに送信させる必要がありますか?
java - Javaスレッドは待機して通知します
私は2つのスレッドを持っています。スレッドAはキューからいくつかの要素をプルし、スレッドBはキューにいくつかの要素を追加しています。
キューが空のときにスレッドAをスリープ状態にしたい。
スレッドBがキューに要素を追加するときは、スレッドAが機能していることを確認する必要があります。これはJavaでどのように行うことができますか?
python - このPythonの生産者と消費者のロックレスアプローチはスレッドセーフですか?
私は最近、単純なプロデューサー/コンシューマー パターンを使用するプログラムを作成しました。最初は、threading.Lock の不適切な使用に関連するバグがありましたが、最終的に修正しました。しかし、生産者/消費者パターンをロックレスで実装することは可能かどうか考えさせられました。
私の場合の要件は単純でした:
- 1 つのプロデューサー スレッド。
- 1 つのコンシューマ スレッド。
- キューには 1 つのアイテムしか入れられません。
- プロデューサーは、現在のアイテムが消費される前に次のアイテムを生成できます。したがって、現在のアイテムは失われますが、それで問題ありません。
- 消費者は、次のアイテムが生成される前に現在のアイテムを消費できます。したがって、現在のアイテムは 2 回 (またはそれ以上) 消費されますが、それは問題ありません。
だから私はこれを書いた:
私の質問は: このコードはスレッドセーフですか?
即時コメント: このコードは実際にはロックレスではありません - 私は CPython を使用しており、GIL を持っています。
コードを少しテストしたところ、うまくいくようです。これは、GIL のためにアトミックな LOAD および STORE 操作に変換されます。del x
しかし、x がメソッドを実装する場合、操作はアトミックではないことも知ってい__del__
ます。したがって、アイテムに__del__
メソッドがあり、厄介なスケジューリングが発生した場合、問題が発生する可能性があります。か否か?
もう 1 つの質問は、上記のコードを正常に動作させるには、どのような制限 (たとえば、生産されるアイテムの種類) を課す必要があるかということです。
私の質問は、CPython と GIL の癖を利用してロックレス (つまり、threading.Lock のようなロックをコードで明示的に使用しない) ソリューションを考え出す理論的な可能性についてのみです。
c# - スレッドセーフな非同期バイトキュー
新しいデータが利用可能になるたびに呼び出されるコールバックメソッドがあります。
これを、次のようなインターフェイスを実装するクラスでラップしたいと思います。
これは明らかに古典的な生産者/消費者問題です。バイトはコールバックメソッドの呼び出しによって生成され、Begin/EndReadメソッドとReadメソッドによって消費されます。データが利用できない場合(タイムアウトが発生するまで)、Begin/EndReadメソッドとReadメソッドはブロックする必要があります。実装では固定サイズの内部バッファーを使用する必要があるため、バッファーが現在いっぱいになると、コールバックメソッドはブロックする必要があります。
マルチスレッドについて考えると、通常、深刻な頭痛の種になるので、私の質問は次のとおりです。そのようなデータ構造の実装はすでにありますか?
(Readメソッドの実装は非常に簡単なはずですが、Begin / EndRead with Readの実装は避けたいと思います。/ Begin
。EndInvoke
)
c# - Generic.Netプロデューサー/コンシューマー
楽しみのために、C#で一般的なプロデューサー/コンシューマーペア+処理キューを実装するというアイデアをいじっています。アイデアは、適切なIProducerおよびIConsumerインターフェイス(デフォルトの実装が提供されます)を実装するオブジェクトを作成し、それらを主にデリゲートで構成し、それらをQueueProcessor
クラスインスタンスに渡し、必要なコンシューマーの数を指定して、移動できるようにすることです。
しかし、私は自分自身に、「自分自身、確かにこれは以前に行われたことがある」と言います。
では、C#でのプロデューサー/コンシューマーパターンの優れた一般的な実装を知っている人はいますか(VB.Netも問題ありません)。私が探している基本的な要件:
- 生成されたタイプと消費されたタイプ(入力、キューに入れられたタスク、出力タイプ、またはそれらの任意の組み合わせ)にジェネリックを使用します
- キューで作業するコンシューマーの数を指定できます
- 複数のキューをパイプラインにリンクまたはチェーンできるようにします(複数のコンシューマーでトリッキーです、私は知っています)
- 独自のプロデューサーとコンシューマーを実装できるようにします
- IEnumerableをプロデューサーに変えることができます(可能な限り、自分で実装する必要がある場合は問題ありません)
- デリゲートベース(基本的なコンシューマーまたはプロデューサーの作業にラムダ構文を使用して単一のアイテムを処理できます)
または、何もない場合、どのような落とし穴がそれを妨げましたか、そしてそれをどのように実装するかについて何か考えがありますか?