8

私は、streadway の amqpライブラリを使用して rabbitmq サーバーに接続しています。ライブラリは、" <- chan Delivery "を返す channel.Consume() 関数を提供します。また、とりわけ「 Delivery 」を返す channel.Get() 関数も提供します。

pop()機能を実装する必要があり、 channel.Get()を使用しています。ただし、ドキュメントには次のように記載されています。

"In almost all cases, using Channel.Consume will be preferred."

ここでの推奨は推奨を意味ますか?channel.Consume() よりも channel.Get() を使用することの欠点はありますか? はいの場合、channel.Consume() を使用して Pop() 関数を実装するにはどうすればよいですか?

4

2 に答える 2

6

ドキュメントからわかる限り、はい、「推奨」は「推奨」を意味します。

channel.Get()は ほど多くの機能を提供していないようです。また、 を個別に返すのではなく、 of をchannel.Consume()返すため、並行コードでより簡単に使用できるようです。chanDeliveryDelivery

言及されている追加機能はexclusive、 、 、noLocalおよびnoWaitオプションTableの args であり、「キューまたはサーバーに固有のセマンティクスを持つ」ものです。

Pop()あなたができることを使用して関数を実装するには、 amqp サンプルの consumerchannel.Consume()からいくつかのコードフラグメントにリンクし、 function を使用してチャネルを作成し、実際に機能を実装するを処理する関数を作成し、 aでfunc を起動しますConsume()chanDeliveryPop()handle()goroutine

これの鍵は、何も受信していない場合、チャネル (リンクされた例) が送信をブロックすることです。この例では、handle()func を使用rangeして、チャネル全体が空になるまで処理します。から最後の値を受け取って返すPop()だけの関数の方が、機能が優れている場合がchanあります。実行されるたびに、最新のDelivery.

編集:チャンネルから最新の値を受け取り、それを処理する関数の例(これはユースケースでは機能しない可能性があります。関数が別の関数に別の関数を送信して処理する場合は、より便利です。また、私は持ってDeliverychanます以下のコードはテストしていません。エラーだらけかもしれません)

func handle(deliveries <-chan amqp.Delivery, done chan error) {
    select {
    case d = <-deliveries:
        // Do stuff with the delivery
        // Send any errors down the done chan. for example:
        // done <- err
    default:
        done <- nil
    }
}
于 2013-06-18T09:06:36.920 に答える