2012-02-21 59 views
4

我想限制Python应用程序中由我的ZeroMQ消息队列消耗的内存量。我知道设置高水位标记会限制发送方排队的数量,但是有没有办法控制接收方排队的数量? Python ZeroMQ绑定似乎将其设置为无限制。使用PyZMQ限制队列长度

我的测试场景:我有两个用于测试的python终端。一个是接收器:

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.core 
>>> context=zmq.Context() 
>>> socket = context.socket(zmq.PULL) 
>>> socket.setsockopt(zmq.RCVBUF, 256) 
>>> socket.bind("tcp://127.0.0.1:12345") 

另一种是发送者:

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.core 
>>> 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()在接收端几次,以确保队列工作,但除此之外,让两个终端就坐在那里。发送循环似乎永远不会阻塞,接收提示似乎有越来越多的内存占用。

回答

3

与ZeroMQ的文档相反,需要在PUSH侧和PULL侧上设置高水位标记。一旦我改变了拉,它运作得更好。新PULL代码:

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.core 
>>> context=zmq.Context() 
>>> socket = context.socket(zmq.PULL) 
>>> socket.setsockopt(zmq.RCVBUF, 256) 
>>> socket.setsockopt(zmq.HWM, 1) 
>>> socket.bind("tcp://127.0.0.1:12345") 
0

其实,文档这样说:

“当ZMQ_PUSH插座进入一个特殊的状态,由于有 达到所有下游节点的高水位标记,或如果根本没有下游节点,那么在 套接字上的任何zmq_send(3)操作都应阻塞,直到异常状态结束或至少有一个下游节点可用于发送;不丢弃消息不是 。

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

这完全可以(也应该)设定的高水位,为下游节点(又名拉),也许意味着把它放在推动侧不会有任何效果的状态(尽管我怀疑这不是事实,因为仍然存在下游节点可用的情况,但是消息传入的速度比它们可以发送的快。)