2011-08-24 61 views
2

我想将ZeroMQ挂钩到gevent循环。使用ZeroMQ API,我可以为套接字获取一个fd。我如何在greenlet中观看这个套接字来处理POLLIN事件,而不会阻塞其他greenlet?在gevent上的fd上倾听POLLIN

回答

2

退房GEVENT-zeromq在github/PyPI中

+0

是的,检查出来,并感谢编写它!不幸的是,它不符合我的利基需求。我可能会同时连接到我的XREP套接字的大量客户端,其中很多客户端可能会阻塞很长一段时间。因此我不能使用正常的zmq方法来连接N个工作套接字,因为它不能缩放。我的解决方法是在XREP套接字上侦听POLLIN,接收消息并在新的greenlet中处理它。一个greenlet将读/写同步到套接字。 AFAIK,在gevent-zeromq中我无法做到这一点。 – ysimonson

+0

当然,只需要一个greenlet处理socket comm并产生新消息(并且可能使用Queue作为inter-greenlet comm)。 – tmc

+0

单个greenlet必须处理套接字上的发送和接收消息,因为我不认为你可以在zmq中同时执行这两个消息。我不能只是在一个循环中使用recv(),因为它会在有潜在的消息发送时阻塞。当它知道有一条可读的消息时,它只需要recv()。 – ysimonson

0

这里是例如,从ZeroMQ。请求回复代理http://zguide.zeromq.org/py:rrbroker 它监听POLLIN事件,并且使用gevent-zeromq不会阻塞其他线程。

做这个你在找什么?

1
# for gevent >= 1.0 
hub = gevent.get_hub() 
watcher = hub.loop.io(fd, 1) # 1 = READ, 2 = WRITE, 3 = READ|WRITE 
hub.wait(watcher) 
# fd is now ready for reading 

但是,如果想知道如何使用gevent-zeromq或扩展它来支持您的用例,那将会更好。