2011-08-24 18 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或擴展它來支持您的用例,那將會更好。