Я рву на себе волосы из-за этого. Я пытаюсь получить простейшие примеры работы с zeromq и gevent. Я изменил этот сценарий, чтобы использовать сокеты PUB/SUB, и когда я запускаю его, сокеты «сервера» зацикливаются навсегда. Если я раскомментирую строку gevent.sleep(0.1), она будет работать, как и ожидалось, и уступит место другому зеленому потоку, которым в данном случае является клиент.
Проблема в том, почему я должен вручную добавлять спящий вызов? Когда я импортирую версию zmq zmq.green, я думал, что вызовы отправки и получения не блокируются, а под ними выполняется переключение задач.
Другими словами, зачем мне добавлять вызов gevent.sleep(), чтобы этот пример заработал? В исходном примере Джеффа Линдси он выполняет сокеты REQ/REP, и ему не нужно добавлять вызовы сна... но когда я изменил это на PUB/SUB, мне нужно, чтобы это было передано клиенту для обработки.
#Notes: Code taken from slide: http://www.google.com/url?sa=t&rct=j&q=zeromq%20gevent&source=web&cd=27&ved=0CFsQFjAGOBQ&url=https%3A%2F%2Fraw.github.com%2Fstrangeloop%2F2011-slides%2Fmaster%2FLindsay-DistributedGeventZmq.pdf&ei=JoDNUO6OIePQiwK8noHQBg&usg=AFQjCNFa5g9ZliRVoN_yVH7aizU_fDMtfw&bvm=bv.1355325884,d.cGE
#Jeff Lindsey talk on gevent and zeromq
import gevent
from gevent import spawn
import zmq.green as zmq
context = zmq.Context()
def serve():
print 'server online'
socket = context.socket(zmq.PUB)
socket.bind("ipc:///tmp/jeff")
while True:
print 'send'
socket.send("World")
#gevent.sleep(0.1)
def client():
print 'client online'
socket = context.socket(zmq.SUB)
socket.connect("ipc:///tmp/jeff")
socket.setsockopt(zmq.SUBSCRIBE, '')
while True:
print 'recv'
message = socket.recv()
cl = spawn(client)
server = spawn(serve)
print 'joinall'
gevent.joinall([cl, server])
print 'end'