我正在使用 ZeroRPC 服务器来实现服务。该服务的一些功能是长时间的 CPU 密集型任务。由于我不希望 RPC 调用阻塞,因此必须适当处理它们。考虑到 GIL,线程似乎不是一个合适的选择。我尝试过多处理,但子进程无法作为 RPC 客户端连接到另一个(不相关的)RPC 服务器。请参阅下面的代码。每次spin_off_worker()
调用时,我都能够生成多个子进程,这一点很重要。在 ZeroRPC 服务器中处理/设计这些长期 CPU 密集型任务的最佳方法是什么?
RPC 服务器 #1
import zerorpc
import multiprocessing
import time
import threading
class Foo(object):
def heavy_task(self):
# some long processing...
# this RPC call never gets made...
cli = zerorpc.Client(connect_to="tcp://0.0.0.0:3334", timeout=30, heartbeat=5)
cli.test()
cli.close()
return
def spin_off_worker(self):
s = multiprocessing.Process(target=self.heavy_task)
s.start()
s.join()
def start():
s = zerorpc.Server(Foo(), heartbeat=5)
s.bind("tcp://0.0.0.0:3333")
s.run()
return s
svr_proc = multiprocessing.Process(target=start)
svr_proc.start()
RPC 服务器 2
import zerorpc
import time
class Foo(object):
def test(self):
print "TIGR"
s = zerorpc.Server(Foo(), heartbeat=5)
s.bind("tcp://0.0.0.0:3334")
s.run()