以下使用了push/pull模型
import zmq
import multiprocessing
class DataServer(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(DataServer, cls).__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self):
self.context = zmq.Context()
self.pull_server = self.context.socket(zmq.PULL)
def start(self):
self.pull_server.bind("tcp://*:5555")
while True:
print "receiving..."
data = self.pull_server
print data
if __name__ == "__main__":
pull_instance = DataServer()
p = multiproessing.Process(target=pull_instance.start, args=())
p.start()
客户端代码:
import zmq
context = zmq.Context()
client = context.socket(zmq.PUSH)
client.connect("tcp://localhost:5555")
client.send("hello world")
在此时,服务端启动后,使用客户端发送数据,服务端没有打印,但是端口测试是通的。另外,cpu利用率会飙到100%。
如果将服务端的初始化函数改为:
def __init__(self):
self.context = zmq.Context()
def start(self):
self.pull_server = self.context.socket(zmq.PULL)
self.pull_server.bind("tcp://*:5555")
while True:
...
此时,服务端可以正常接收和处理数据
目前原因不明,在进行进程fork的过程与zmq的socket实例生成之间到底发生了什么故事。
有兴趣可以讨论