gpt4 book ai didi

python - zeroRPC 多处理的奇怪问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:07 25 4
gpt4 key购买 nike

因此,我正在为一个宠物项目使用 ZeroRPC 和 Tornado,在将 ZeroRPC 与 python 的多处理库结合使用时遇到了一些问题。具体来说,我正在以编程方式创建和运行新的 ZeroRPC 服务器,但通常在运行时,zerorpc 服务器会阻塞,所以我的想法是将它扔到另一个进程中,如下所示:

 server = zerorpc.Server(FuncWrapper())
server.bind(server_address)
process = multiprocessing.Process(target=server.run)
process.start()

但是,当我这样做时,调用 RPC 服务器只是挂起,这是端点未正确实例化时的典型行为。但是,如果我只是让服务器运行 block 并像这样调用它:

 serhouldver = zerorpc.Server(FuncWrapper())
server.bind(server_address)
server.run()

一切正常。我的理解是这两个实现应该是等效的,但不知何故它们不是。

有什么想法吗?

最佳答案

zerorpc 使用 gevent 进行协作异步 IO。您可能想了解 tornado、多处理和 gevent 是如何协同工作的。

我能说的是:

server = zerorpc.Server(FuncWrapper())
server.bind(server_address)
process = multiprocessing.Process(target=server.run)
process.start()

第 1 行和第 2 行在当前进程上创建和绑定(bind)端口。但是在第 3 行和第 4 行,我猜发生的事情是:

  • fork被调用,进程中的所有线程都在fork中丢失
  • 任何 zeromq 套接字和上下文现在都死了(没有更多线程)。好消息是,上下文可以被破坏,并创建一个新的(参见 http://lists.zeromq.org/pipermail/zeromq-dev/2014-January/024536.html )。
  • 现在您在本地进程上打开了一个端口,带有一个事件的 zeromq 套接字,但是没有人从这个套接字读取数据(因此当您与它交谈时没有反应)。
  • 另一方面,在多进程的进程中,zerorpc 正在运行,在原始 zmq 套接字的 relics 上调用 recv。什么都不会来,zeromq 已经死了。

未经测试,我只能猜测在新进程中完全运行 zerorpc 应该可行:

def ZeroRPC_Service():
server = zerorpc.Server(FuncWrapper())
server.bind(server_address)
server.run()

process = multiprocessing.Process(target=ZeroRPC_Service)
process.start()

然后通过一些管理器对象或多进程提供的其他共享内存服务,您可以使新进程中的 zerorpc 服务器访问并与本地进程共享数据。

附带说明一下,如果你想做的是不阻塞地调用 server.run(),如果你只使用 gevent,我会告诉你只需在它自己的协程中运行它:

server = zerorpc.Server(FuncWrapper())
server.bind(server_address)
server_coro = gevent.spawn(server.run)

也许您可以直接从 tornado 协程/异步函数调用 server.run。也许有一种方法可以将 gevent 和 tornado 集成(就像这个链接建议:https://bmmh.wordpress.com/2012/10/07/tornado-and-gevent/ ),我目前还不知道可以帮助你。

关于python - zeroRPC 多处理的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27198803/

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