2012-05-03 4 views
14

私は、要素が先入れ先出しでなければならないキュー構造(データコンテナ)を探したいと思います。構造がスレッドセーフでなければならないことは私にとって重要です。私はこのデータコンテナをタスクや接続プールのようなものとして使うつもりです。Goのバッファリングされたチャネルをスレッドセーフなキューとして使用できますか?

私はバッファリングされたチャネルがスレッドセーフであることを知っていますが、特に同時の状況では、FIFOとして動作するのだろうかと思います。

スレッドセーフなキューとしてバッファリングされたチャネルを使用することができる場合は、その効率について心配する必要がありますか?

+1

チャンネルが答えです。そのような仕事のためのチャンネルよりも優れたものを見つけたり、書くことはほとんどありません。 – Mostafa

+1

チャネルは、タスクキュー、リソース共有、接続プールなどに特に適しています。スレッド言語のパターンを再現しないように注意してください.Go言語の大きな進歩の1つは、ゴルーチン+チャンネルメカニズムです。それを理解してください(おそらくSOにアーキテクチャや戦略を提出することができます)。 –

+1

これは私がGoのチャンネルについて学んだときに最初に思ったことです、これを聞いてくれてありがとう! – karysto

答えて

2

私はチャンネルがFIFOであることを確信しています。彼らは安価であるので、メモリ効率が良いでしょう。それを超えて、あなたがそれらを使う方法の詳細を知らずに、私たちはもっと多くの助言を与えることはできません。

+0

ありがとう。だから、チャンネルはFIFOとスレッドセーフです。チャンネルの仕組みの実装の詳細について私にリンクや何かを教えてください。 – hardPass

+0

最終的なドキュメントは次のとおりです。http://code.google.com/p/go/source/browse/src/pkg/runtime/chan.c詳細については、chansendおよびchanrecvの実装を参照してください。仕様では、特にFIFOキューであるとは言いませんが、どのように使用するかの詳細から考えることができます。 –

+0

しかし、私はgolangチャンネルを使用するのが、RabbitMQやActiveMQのようなメッセージブローカーを使用するよりも、多くの時間、安全性が低く、標準化されていて、完全ではないかと思います。だから私はそれが補償的なアプローチだとは思わない – deFreitas

11

バッファ内のチャネルは、スレッドセーフFIFOキューです。そのため、何をしようとしているかは完全に有効です。このアプローチでは、パフォーマンスの問題が発生してはなりません。

0

一般に、私はバッファされたチャネルが良い並行処理安全なキューを作っていないと言います。それらを作成すると、バッファ全体にメモリが割り当てられます。実行中にキューのサイズが非常に小さいものから非常に大きいものに変化する場合、最悪の場合のシナリオに割り当てる必要があり、多くのメモリを浪費している可能性があります。

関連する問題