gpt4 book ai didi

python - 为什么当我使用 multiprocessing.Process 运行时 ZeroMQ 无法通信?

转载 作者:行者123 更新时间:2023-12-04 03:59:21 31 4
gpt4 key购买 nike

请看下面的代码:
server.py

import zmq 
import time
from multiprocessing import Process
class A:
def __init__(self):
ctx = zmq.Context(1)
sock = zmq.Socket(ctx, zmq.PUB)
sock.bind('ipc://test')
p = Process(target=A.run, args=(sock,))
p.start() # Process calls run, but the client can't receive messages
p.join() #
#A.run(sock) # this one is ok, messages get it to be received

@staticmethod
def run(sock):
while True:
sock.send('demo'.encode('utf-8'))
print('sent')
time.sleep(1)

if __name__ =='__main__':
a = A()
client.py
import zmq 
ctx=zmq.Context(1)
sock = zmq.Socket(ctx, zmq.SUB)
sock.connect('ipc://test')
sock.setsockopt_string(zmq.SUBSCRIBE, '')
while True:
print(sock.recv())
server.py 的构造函数中, 如果我调用 .run() -方法直接,客户端可以接收消息,但是当我使用 multiprocessing.Process() -方法,它失败了。任何人都可以对此进行解释并提供一些建议吗?

最佳答案

Q : "Why ZeroMQ fails to communicate when I use multiprocessing.Process to run?"


嗯,ZeroMQ 不通信失败,问题是,Python 怎么 multiprocessing模块“运行”。
该模块的设计使得某些处理可能会从 python 中央 GIL 锁中逃脱(re- [SERIAL] -iser,它被用作永远存在的 [CONCURRENT] -situations' 主要避免者 )。
这意味着对 multiprocessing.Process 的调用对 python 解释器状态进行精确的“镜像复制”,“导出”到新的 O/S 生成的进程中(详细信息取决于 localhost O/S)。
鉴于此,“镜像”副本可以访问已由 __main__ 拥有的资源的可能性为零。 - 这里是 .bind() -方法已经获得 ipc://test地址,因此“远程”进程永远不会获得“许可”来触摸这个 ZeroMQ 接入点,除非代码得到修复和完全重构。

Q : "Can anyone explain on this and provide some advice?"


当然。开始的最佳步骤是充分了解垄断 GIL-lock re- [SERIAL] 的 Pythonic 文化-isation,不会同时发生两件事,因此即使添加更多线程也不会加快处理流程,因为这一切都会被中央“垄断者” GIL 锁重新对齐。
接下来,理解完全反射(reflect) python 解释器状态副本的 promise ,虽然听起来很有希望,但也有一些明显的缺点——新进程,是“镜像”——副本不能在已经拥有的资源上引入冲突案例。如果他们尝试这样做,那么在这种主要设计不良的情况下,没有按预期工作的情况是较温和的问题。
在您的代码中, __main__ 中的第一行实例化 a = A() , 其中 A.__init__方法直接占用 IPC 资源,因为 .bind('ipc://test') .后一步, p = Process( target = A.run, args = ( sock, ) ) “镜像”——复制 python 解释器的状态(原样复制)和 p.start()为了“拥有”与 __main__ 相同的资源,不得不陷入残疾。已经拥有(是的,“镜像”进程的 ipc://test 指示调用在 .bind('ipc://test') 中获取相同的非免费资源)。这永远不会飞。
最后但并非最不重要的一点,享受零之禅,马丁 SUSTRIK 的杰作 ,为最终可扩展、几乎零延迟、非常舒适、广泛移植的信令和消息传递框架而精心设计。

关于python - 为什么当我使用 multiprocessing.Process 运行时 ZeroMQ 无法通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63333535/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com