1

Go について私が気に入らない点の 1 つは、チャネル受信によってチャネルからデータも削除されることです。これにより、2 つ以上のゴルーチンが互いに通信できるようにする必要がある場合でも、2 つのゴルーチンのみが互いに通信できるようになります。

チャネルの配列を作成し、ゴルーチンごとにチャネルを持つことができることはわかっていますが、データを 1 つのゴルーチンから他のすべてのゴルーチンに移動することは、データの 1 つのコピーをすべてのゴルーチンに移動するよりもはるかに多くのデータを RAM に転送します。

サーバーに数千のクライアントが接続されていて、そのメッセージを受信する 500 の goroutine の半分だけにメッセージを送信したい場合を考えてみてください。メッセージが 512 バイトの場合、RAM の移動では 250 キロバイトのデータになりますが、チャネルが受信時にデータを削除しない場合、同じデータを 1 回だけ移動することができます。

それで、これを行う簡単な方法があるかどうか、または同期パッケージのミューテックスを使用する必要があるかどうかを尋ねていますか? ただし、計算が間違っていて、チャネルがデータをコピーしない場合は教えてください。その場合、チャネルの配列を管理できるからです。

4

2 に答える 2

2

この記事を読む:

http://rogpeppe.wordpress.com/2009/12/01/concurrent-idioms-1-broadcasting-values-in-go-with-linked-channels/

これは、ゴルーチン間でチャネルブロードキャストを行うさまざまな方法に関する分析であり、そのうちの 1 つは特に興味深いものです。

type Broadcaster struct {
    Listenc chan chan (chan broadcast);
    Sendc   chan<- interface{};
}

このアプローチは、作成者によって「リンクされたチャネル」(リンクされたリストに類似) と呼ばれます。

計算が間違っていて、チャネルがデータをコピーしないかどうか教えてください。その場合、チャネルの配列を管理するだけでよいからです。

あなたは間違っていません。ただし、@Jsorが示唆したように、コピーのオーバーヘッドが心配で、ユースケースで許可されている場合は、ポインターを渡すだけでかまいません。

于 2013-08-02T08:02:27.033 に答える