python多进程与zeromq

zeromq的多进程启动问题

以下使用了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实例生成之间到底发生了什么故事。

有兴趣可以讨论

你可能感兴趣的:(python)