Python 使用zeroRPC进行多处理时出现的奇怪问题

Python 使用zeroRPC进行多处理时出现的奇怪问题,python,multiprocessing,rpc,zeromq,zerorpc,Python,Multiprocessing,Rpc,Zeromq,Zerorpc,因此,我在一个宠物项目中使用ZeroRPC和Tornado,我在使用ZeroRPC与python的多处理库时遇到了一些问题。具体来说,我以编程方式创建和运行新的ZeroRPC服务器,但通常在运行时,ZeroRPC服务器会阻塞,因此我的想法是将其放入另一个进程中,如下所示: server = zerorpc.Server(FuncWrapper()) server.bind(server_address) process = multiprocessing.Process(target=se

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

 server = zerorpc.Server(FuncWrapper())
 server.bind(server_address)
 process = multiprocessing.Process(target=server.run)
 process.start()
然而,当我这样做时,调用
RPC
服务器只是挂起,这是端点没有正确实例化时的典型行为。但是,如果我只是让运行的服务器阻塞并这样调用它:

 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行正在当前进程上创建和绑定端口。但在第3行和第4行,我能猜到发生了什么:

  • 调用fork时,进程中的所有线程都将丢失在fork中
  • 任何zeromq套接字和上下文现在都已失效(不再有线程)。好消息是,可以破坏上下文,并创建一个新的上下文(请参阅)
  • 现在,您的本地进程上有一个打开的端口,带有一个活动的zeromq套接字,但是没有人从这个套接字读取数据(因此,当您与它交谈时没有反应)
  • 另一方面,在多进程的进程中,zerorpc正在运行,在原始zmq套接字的遗迹上调用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协同程序/asyunc函数运行
。也许有一种方法可以整合gevent和tornado(如下面的链接所示:),我不知道如何在这一点上帮助您