在 zeromq 中使用进程而不是线程

Using process instead of thread with zeromq

我正在阅读这段代码http://zguide.zeromq.org/py:mtserver 但是当我试图用 multiprocessing.Process 替换 threading.Thread 时,我得到了错误

Assertion failed: ok (mailbox.cpp:84)

代码是

import time
import threading
import zmq

def worker_routine(worker_url, context=None):
    """Worker routine"""
    context = context or zmq.Context.instance()
    # Socket to talk to dispatcher
    socket = context.socket(zmq.REP)

    socket.connect(worker_url)

    while True:

        string  = socket.recv()

        print("Received request: [ %s ]" % (string))

        # do some 'work'
        time.sleep(1)

        #send reply back to client
        socket.send(b"World")

def main():
    """Server routine"""

    url_worker = "inproc://workers"
    url_client = "tcp://*:5555"

    # Prepare our context and sockets
    context = zmq.Context.instance()

    # Socket to talk to clients
    clients = context.socket(zmq.ROUTER)
    clients.bind(url_client)

    # Socket to talk to workers
    workers = context.socket(zmq.DEALER)
    workers.bind(url_worker)

    # Launch pool of worker threads
    for i in range(5):
        process = multiprocessing.Process(target=worker_routine, args=(url_worker,))
        process.start()

    zmq.device(zmq.QUEUE, clients, workers)

    # We never get here but clean up anyhow
    clients.close()
    workers.close()
    context.term()

if __name__ == "__main__":
    main()

每种传输方式的限制详见API

inproc 用于进程内通信(即线程)。您应该尝试 ipc 支持进程间通信,甚至只是 tcp.