首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python zerorpc多线程

python zerorpc多线程
EN

Stack Overflow用户
提问于 2019-01-17 17:27:30
回答 1查看 654关注 0票数 0

我正试图为python程序构建一个前端服务。我选择了zerorpc在NodeJS和python之间进行通信,这很好,唯一的问题是我不能正确地使用多线程zerorpc。

我见过几个帖子讨论过zerorpc和普通线程是如何不喜欢对方的。但是,我的后端服务已经有点高级,并且使用了几个线程。

那么,现在的问题是,是否可以以某种方式将普通线程和zerorpc结合起来,还是需要重写我的主代码来使用与zerorpc相同的线程库?

我在普通线程中遇到的主要问题是启动服务器的线程完全冻结,因此不能再关闭。下面是我当前启动服务器的方式:

代码语言:javascript
复制
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()

我还试图用以下函数杀死服务器,但这导致了一个不太理想的异常

代码语言:javascript
复制
def kill_server():
    global server
    server.stop()

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的任何细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54241271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档