QA@IT

スレッド間通信で Array ではなく Queue を使う利点

3716 PV

ワーカースレッドなどを実装するときに、キューを貯めておくのに Array ではなく Queue (または SizedQueue) を使う例をよく見ます。

Queue や SizedQueue は空になったときにブロックしてくれるので使いやすいという利点があると思いますが、それ以外に何か利点はありますか?

回答

スレッド間通信が1:1で行われるのであれば正直、趣味の問題(ブロックしてくれるのを便利と思うかうざいと思うか)ではないかとおもいますが、m:nでの通信を行う場合はArrayではなかなか厳しいです。ワーカースレッドという話なので、ワーカーが複数いる場合を考えてください:

    producer  ---+--- worker #1
                 |
                 +--- worker #2
                 |
                 +--- worker #3
                 |
                ...

こういう状況でワーカーがジョブをうばいあうような場合、Arrayを使うのは困難です。たとえばworker #1キューにジョブがたまっていることを確認して、キューから取り出そうとしたときには、もうworker #2がそれを取り出してしまっているかもしれないわけです。

Queueを使うのであればそのようなことは起こりません。

編集 履歴 (0)
  • なるほど、Array を使うとかえって困難なのだということが理解できました! -

ruby ではなく、一般的なスレッド間通信を前提とした回答です。

Queueを使うことにより、FIFOで処理してね、ってことがより明確に伝わるのではないでしょうか。
Array(配列とかリストを想定)だと、どこから処理すべきか、どれくらい処理すべきかは処理側に任せる感じがします。

編集 履歴 (0)
  • なるほど。一目見ればどのような処理を意図しているかが分かるというのは大きなポイントですね。 -

Mutexを使って排他制御をちゃんとしてるところとかですかね……(Queueクラスの実装を見るとそんな感じ)

編集 履歴 (0)
  • ふむふむ。排他処理は重要ですね。ありがとうございます! -
ウォッチ

この質問への回答やコメントをメールでお知らせします。