pythonzerorpc 多线程

python zerorpc multithreading

我正在尝试为 python 程序构建前端服务。我选择 zerorpc 在 NodeJS 和 python 之间进行通信,效果很好,我唯一的问题是我不能正确地多线程 zerorpc。
我看到几个 post 谈论 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()

提前感谢您对我的帮助!

zerorpc 实现了与 gevent 的并发(ioloop + coroutines 等)。 Gevent是单线程的,初始化后只能从最初初始化它的线程开始使用。在您的例子中,这是调用 server.run() 的线程。因此,您只能与同一线程中的 zerorpc 方法进行交互。

您可以使用 monkey patch (http://www.gevent.org/intro.html#monkey-patching) 有效地使您的 Thread 对象表现得像协程。如果您仅将线程用于 IO 并发,那么这可能就足够了。

否则,如果您想要线程实现 CPU 并行性,一个行之有效的解决方案是使用子进程工作线程作为单独的线程。您可以在主服务器和工作服务器之间使用 zerorpc(unix 套接字非常适合这里)。因为工作人员无论如何都是 CPU 绑定和本地的,所以您可以禁用服务器和工作人员之间的心跳 (Client/Server(heartbeat=0))。

但是我找不到任何关于如何安全地混合系统线程和 gevent 的细节。