【发布时间】:2017-12-09 02:09:32
【问题描述】:
我正在尝试通过 ZeroMQ 套接字与我开始使用 multiprocessing.Process 的子进程通信。我知道存在与multiprocessing 模块中的子进程通信的解决方案,但我想最终与用 C++ 编写的共享库中的函数通信。废话不多说,代码如下:
import time
import zmq
import multiprocessing
def perform(nseconds, endpoint):
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.connect(endpoint)
for i in range(5):
time.sleep(nseconds)
publisher.send_string("{}".format(i))
publisher.send_string(">>END")
if __name__ == "__main__":
multiprocessing.freeze_support()
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.bind("tcp://*:*")
socket.setsockopt_string(zmq.SUBSCRIBE, u"")
endpoint = socket.getsockopt_string(zmq.LAST_ENDPOINT)
print("Binding via {}".format(endpoint))
t = multiprocessing.Process(target=perform, args=(1,endpoint))
t.start()
string = ""
while not ">>END" in string:
string = socket.recv_string()
print(string)
t.join()
此代码在 GNU/Linux 上运行良好,并具有预期的输出:
Binding via tcp://0.0.0.0:34149
0
1
2
3
4
>>END
但是在 Windows 上使用来自 Anaconda 的 Python 和安装了 conda install pyzmq 的 pyzmq 版本 16.0.2 运行它会崩溃并出现以下错误:
Binding via tcp://0.0.0.0:52019
Assertion failed: Can't assign requested address (bundled\zeromq\src\tcp_connect
er.cpp:341)
我该如何解决这个问题?还是我做错了?如果我做错了,为什么它依赖于平台?
【问题讨论】:
标签: python multiprocessing zeromq