我正试图为python程序构建一个前端服务。我选择了zerorpc在NodeJS和python之间进行通信,这很好,唯一的问题是我不能正确地使用多线程zerorpc。
我见过几个帖子讨论过zerorpc和普通线程是如何不喜欢对方的。但是,我的后端服务已经有点高级,并且使用了几个线程。
那么,现在的问题是,是否可以以某种方式将普通线程和zerorpc结合起来,还是需要重写我的主代码来使用与zerorpc相同的线程库?
我在普通线程中遇到的主要问题是启动服务器的线程完全冻结,因此不能再关闭。下面是我当前启动服务器的方式:
self.communication_thread = Thread(target=communication_server.start_communication_server)
self.communication_thread.start()
def start_communication_server():
global server
addr = 'tcp://127.0.0.1:4242'
server = zerorpc.Server(CommunicationServer())
server.bind(addr)
print('Created a new communicationserver running on {}'.format(addr))
server.run()我还试图用以下函数杀死服务器,但这导致了一个不太理想的异常
def kill_server():
global server
server.stop()提前感谢您的帮助!
发布于 2019-01-24 23:13:54
zerorpc实现了与gevent (ioloop + coroutines等)的并发。Gevent是单线程的,在初始化之后,只能从用于初始化它的线程中使用。在您的示例中,这是调用server.run()的线程。因此,您必须只与来自同一个线程的zerorpc方法交互。
您可以使用猴子补丁(http://www.gevent.org/intro.html#monkey-patching)来有效地使您的Thread对象表现得像一个协同线。如果您只使用线程处理IO并发,那么这可能就足够了。
否则,如果您希望线程具有CPU并行性,一个行之有效的解决方案是将子进程工作人员作为单独的线程使用。您可以在主服务器和工作人员之间使用zerorpc (unix套接字在这里非常合适)。因为工作人员是CPU绑定的和本地的,所以可以禁用服务器和工作人员(Client/Server(heartbeat=0))之间的心跳。
但是,我没有找到关于如何安全地混合系统线程和gevent的任何细节。
https://stackoverflow.com/questions/54241271
复制相似问题