5

PythonアプリケーションでZeroMQメッセージキューによって消費されるメモリの量を制限したいと思います。最高水準点を設定すると、送信側でキューに入れられる量が制限されることは知っていますが、受信側でキューに入れられる量を制御する方法はありますか?Python ZeroMQバインディングでは、無制限に設定されているようです。

私のテストシナリオ:テストに使用しているPythonターミナルが2つあります。1つは受信者です。

Python 2.5.1 (r251:54863, Aug 25 2008, 20:50:04) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> import zmq
>>> context = zmq.Context()
>>> socket = context.socket(zmq.PULL)
>>> socket.setsockopt(zmq.RCVBUF, 256)
>>> socket.bind("tcp://127.0.0.1:12345")

もう1つは送信者です。

Python 2.5.1 (r251:54863, Aug 25 2008, 20:50:04) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> import zmq
>>> context=zmq.Context()
>>> socket = context.socket(zmq.PUSH)
>>> socket.setsockopt(zmq.SNDBUF, 2048)
>>> socket.setsockopt(zmq.HWM, 1)
>>> socket.connect("tcp://127.0.0.1:12345")
>>> num = 0
>>> while True:
...  print num
...  socket.send(str(num))
...  num = num + 1
... 

キューが機能することを確認するために受信側で数回実行socket.recv()しますが、それ以外は、2つの端末をそのままにします。送信ループがブロックされることはなく、受信プロンプトのメモリフットプリントが増加しているようです。

4

3 に答える 3

0

実際、ドキュメントには次のように書かれています。

「ZMQ_PUSH ソケットが、すべてのダウンストリーム ノードの最高水準点に達したために例外的な状態になった場合、またはダウンストリーム ノードがまったくない場合、例外的な状態が終了するか、ソケットに対する zmq_send(3) 操作はすべてブロックされます。少なくとも 1 つのダウンストリーム ノードが送信可能になり、メッセージは破棄されません。」

http://api.zeromq.org/2-1:zmq-socket

これは、ダウンストリーム ノード (別名プル) の最高水準点を設定できる (および設定する必要がある) ことを明確に述べており、おそらく、プッシュ側に設定しても効果がないことを意味します (ただし、それは真実ではないと思われます。ダウンストリーム ノードが使用可能であるが、メッセージが送信されるよりも速く受信される場合)。

于 2015-03-25T17:19:02.543 に答える