python multiprocessing似乎不适用于类

时间:2019-08-15 15:22:34

标签: python multiprocessing zeromq python-multiprocessing pyzmq

我正在尝试实现zmq客户端包装程序类。希望所写的评论对您有所帮助。请参阅__main__了解我尝试过的其他方法。

import zmq

class Client(object):
    """
    This is class for passing message using pipeline(push-pull) pattern of zmq.

    """

    def __init__(self, pull_addr="tcp://127.0.0.1:5757",\
                push_addr="tcp://127.0.0.1:5858"):
        """
        The constructor

        Parameters:
        pull_addr (string) : Local endpoint for pushing messages and pulling from
        push_addr (string) : Remote endpoint for pushing messages.
        """
        super(Client, self).__init__()
        print("Initialized...")
        self.context = zmq.Context()
        self.push_addr = push_addr
        self.pull_addr = pull_addr

    def producer(self, msg):
        """
        Produces messages.

        It's a wrapper and will receive the message which will be queued locally by
        pushing to self.pull_addr. 

        Parameters:
        msg (json) : Messages to be queued.

        Returns:
        None
        """
        print("Production started.... ")
        zmq_socket = self.context.socket(zmq.PUSH)
        zmq_socket.bind(self.pull_addr)
        zmq_socket.send_json(msg)

    def consumer(self):
        """
        Consumes messages produced by self.producer.

        Reads messages queued by self.producer and pushes to the self.push_addr
        where it assumes the collector would be expecting messages.

        Parameters:
        None

        Returns:
        None
        """
        print("consumption is awaiting...")
        receiver = self.context.socket(zmq.PULL)
        receiver.connect(self.pull_addr)

        sender = self.context.socket(zmq.PUSH)
        sender.connect(self.push_addr)

        while True:
            msg = receiver.recv_json()
            sender.send_json(msg)


if __name__ == '__main__':
    import multiprocessing
    # con_pool = multiprocessing.Pool()
    # # pro_pool = multiprocessing.Pool()
    zmq_client = Client()
    # consumer = con_pool.apply_async(zmq_client.consumer, ())
    # # producer = pro_pool.apply_async(zmq_client.producer,({"msg" : "Hello World!"}))
    # print("DONE>>>>")

    # from multiprocessing import Process
    # consumer = Process(target=zmq_client.consumer)
    # consumer.start()

    # producer = Process(target=zmq_client.producer, args=({'msg' : "Hello World!"}))
    # producer.start()
    # producer.join()
    # consumer.join()

    pool = multiprocessing.Pool()
    p = pool.apply_async(zmq_client.consumer)
    p2 = pool.apply_async(zmq_client.producer, ({"msg" : "Hello World!"})) 

尝试1

pool = multiprocessing.Pool()
p = pool.apply_async(zmq_client.consumer) 
p2 = pool.apply_async(zmq_client.producer, ({"msg" : "Hello World!"}))

输出1
    calls the constructor and terminates.

尝试2

con_pool = multiprocessing.Pool()
pro_pool = multiprocessing.Pool()
zmq_client = Client()
consumer = con_pool.apply_async(zmq_client.consumer, ())
producer = pro_pool.apply_async(zmq_client.producer,({"msg" : "Hello World!"})) 

输出2

calls the constructor and terminates. 

尝试3

from multiprocessing import Process
zmq_client = Client()
con = Process(target=zmq_client.consumer)
con.start()

pro = Process(target=zmq_client.producer, args=({'msg' : "Hello World!"}))
pro.start()
pro.join()
con.join()

输出3

calls the constructor
calls the consumer
calls the producer
keeps hanging

在这里,我期望zmq服务器接收到该消息。有什么建议可以让这堂课按预期工作吗?

0 个答案:

没有答案