我正在把头发拉到这个上面。我正在尝试使用 zeromq 和 gevent 获得最简单的示例。我将此脚本更改为使用 PUB/SUB 套接字,当我运行它时,“服务器”套接字永远循环。如果我取消注释 gevent.sleep(0.1) 行,那么它会按预期工作并让给另一个绿色线程,在这种情况下是客户端。
问题是,为什么我必须手动添加睡眠呼叫?我认为当我导入 zmq 的 zmq.green 版本时,发送和接收调用是非阻塞的,并且在下面进行任务切换。
换句话说,为什么我必须添加 gevent.sleep() 调用才能使这个示例正常工作?在 Jeff Lindsey 的原始示例中,他正在执行 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'