这是我的脚本。
#!/usr/bin/env python
import traceback
import sys
import zmq
from time import sleep
print "Creating the zmq.Context"
context = zmq.Context()
print "Binding the publisher to the local socket at port 5557"
sender = context.socket(zmq.PUB)
sender.bind("tcp://*:5557")
print "Binding the subscriber to the local socket at port 5557"
receiver = context.socket(zmq.SUB)
receiver.connect("tcp://*:5557")
print "Setting the subscriber option to get only those originating from \"B\""
receiver.setsockopt(zmq.SUBSCRIBE, "B")
print "Waiting a second for the socket to be created."
sleep(1)
print "Sending messages"
for i in range(1,10):
msg = "msg %d" % (i)
env = None
if i % 2 == 0:
env = ["B", msg]
else:
env = ["A", msg]
print "Sending Message: ", env
sender.send_multipart(env)
print "Closing the sender."
sender.close()
failed_attempts = 0
while failed_attempts < 3:
try:
print str(receiver.recv_multipart(zmq.NOBLOCK))
except:
print traceback.format_exception(*sys.exc_info())
failed_attempts += 1
print "Closing the receiver."
receiver.close()
print "Terminating the context."
context.term()
"""
Output:
Creating the zmq.Context
Binding the publisher to the local socket at port 5557
Binding the subscriber to the local socket at port 5557
Setting the subscriber option to get only those originating from "B"
Waiting a second for the socket to be created.
Sending messages
Sending Message: ['A', 'msg 1']
Sending Message: ['B', 'msg 2']
Sending Message: ['A', 'msg 3']
Sending Message: ['B', 'msg 4']
Sending Message: ['A', 'msg 5']
Sending Message: ['B', 'msg 6']
Sending Message: ['A', 'msg 7']
Sending Message: ['B', 'msg 8']
Sending Message: ['A', 'msg 9']
Closing the sender.
['B', 'msg 2']
['B', 'msg 4']
['B', 'msg 6']
['B', 'msg 8']
['Traceback (most recent call last):\n', ' File "./test.py", line 43, in \n print str(receiver.recv_multipart(zmq.NOBLOCK))\n', ' File "socket.pyx", line 611, in zmq.core.socket.Socket.recv_multipart (zmq/core/socket.c:5181)\n', ' File "socket.pyx", line 514, in zmq.core.socket.Socket.recv (zmq/core/socket.c:4811)\n', ' File "socket.pyx", line 548, in zmq.core.socket.Socket.recv (zmq/core/socket.c:4673)\n', ' File "socket.pyx", line 99, in zmq.core.socket._recv_copy (zmq/core/socket.c:1344)\n', 'ZMQError: Resource temporarily unavailable\n']
['Traceback (most recent call last):\n', ' File "./test.py", line 43, in \n print str(receiver.recv_multipart(zmq.NOBLOCK))\n', ' File "socket.pyx", line 611, in zmq.core.socket.Socket.recv_multipart (zmq/core/socket.c:5181)\n', ' File "socket.pyx", line 514, in zmq.core.socket.Socket.recv (zmq/core/socket.c:4811)\n', ' File "socket.pyx", line 548, in zmq.core.socket.Socket.recv (zmq/core/socket.c:4673)\n', ' File "socket.pyx", line 99, in zmq.core.socket._recv_copy (zmq/core/socket.c:1344)\n', 'ZMQError: Resource temporarily unavailable\n']
['Traceback (most recent call last):\n', ' File "./test.py", line 43, in \n print str(receiver.recv_multipart(zmq.NOBLOCK))\n', ' File "socket.pyx", line 611, in zmq.core.socket.Socket.recv_multipart (zmq/core/socket.c:5181)\n', ' File "socket.pyx", line 514, in zmq.core.socket.Socket.recv (zmq/core/socket.c:4811)\n', ' File "socket.pyx", line 548, in zmq.core.socket.Socket.recv (zmq/core/socket.c:4673)\n', ' File "socket.pyx", line 99, in zmq.core.socket._recv_copy (zmq/core/socket.c:1344)\n', 'ZMQError: Resource temporarily unavailable\n']
Closing the receiver.
Terminating the context.
"""
而且,问题是......为什么这段代码不起作用?
[编辑] 在 zeromq 邮件列表上获得超快速响应后,我更新了上面的代码。