5

Pythonを使用したDebian/マルチプロセスの状況でzeromqを使用しようとしています。多数のセンサーから生データをデコードし、zmqで公開するプロセスがいくつかあります。ここまでは順調ですね。zmqの生データをサブスクライブし、いくつかの計算を実行する計算プロセスがあります。次に、他のプロセスがログに記録して消費するために、その回答を公開する必要があります。したがって、私の計算プロセスは、同じプロセスでサブスクライブとパブリッシュの両方を行う必要があります。

import zmq
import json
context = zmq.Context()

sub = context.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, '')
sub.setsockopt(zmq.RCVBUF, 0)
sub.bind("tcp://127.0.0.1:5000")

pub = context.socket(zmq.PUB)
pub.bind("tcp://127.0.0.1:5000")

上記を試しましたが、うまくいきませんでした。エラーを返します...

File "socket.pyx", line 465, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4749)
zmq.core.error.ZMQError: Address already in use

ドキュメントやグーグルなどを読みましたが、今は完全に行き詰まっています。

4

1 に答える 1

2

同じポート(5000)に2回バインドしようとすると、Address already in useエラーが発生します。ポートにバインドできるソケットは1つだけです。

しかし、subソケットはすべきではありません。別のプロセスが公開している(つまり、実行している)ホスト/ポートに対してbind()実行する必要があります。コードは次のようになります。connect()bind()

sub = context.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, '')
sub.setsockopt(zmq.RCVBUF, 0)
sub.connect("tcp://127.0.0.1:XXXX")

pub = context.socket(zmq.PUB)
pub.bind("tcp://127.0.0.1:YYYY")

XXXXポートと同じものを用意するつもりはないと思います。そうすればYYYY、同じプロセスがそれ自体が公開しているメッセージをリッスンします。

于 2012-10-01T16:54:57.637 に答える