如何在python线程中运行zeroRpc服务器?

2024-10-01 22:36:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中启动zeroRPC服务器时遇到问题。我是根据official example来做的,但是当我调用run()方法时,它是在无休止的循环中工作的,所以我的程序在启动这个服务器后无法继续。我尝试在新线程中运行它,但出现以下异常:

LoopExit: ('This operation would block forever', <Hub at 0x7f7a0c8f37d0 epoll pending=0 ref=0 fileno=19>)

我真的不知道怎么修好它。有什么想法吗?在


Tags: 方法run程序服务器examplethisblock线程
1条回答
网友
1楼 · 发布于 2024-10-01 22:36:35

简而言之,您不能使用带有zerorpc的os线程。在

更长的答案:zerorpc python使用gevent作为IO。这意味着您的项目必须使用gevent并与之兼容。原生操作系统线程和gevent协同程序(也称为greenlet、green threads等)并不是真正的朋友。在

gevent(http://www.gevent.org/gevent.threadpool.html)中有一个本机线程池选项。在

不能生成本机操作系统线程并在其中运行gevent协同程序(包括zerorpc)。在

如果您正在使用gevent协同例程,那么不要在本机线程中运行run(),而是在gevent协同例程/greenlet/greenthread中运行它,如下所示:

# starts the server in its own greenlet
gevent.spawn(myserver.run)
# zerorpc will spawn many more greenlet as needed.
# they all need to run cooperatively

# here we are continuing on the main greenlet.
# as a single greenlet can execute at a time, we must never block
# for too long. Using gevent IOs will cooperatively yield for example.
# Calling gevent.sleep() will yield as well.
while True:
  gevent.sleep(1)

注意:如果gevent不是一个选项,一个解决方案是实现一个zerorpc python版本,它不使用gevent并在python外部实现其IO,但这有一个有趣的复杂性,而且不会很快发生。在

相关问题 更多 >

    热门问题