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

How do I run zeroRpc server in thread in python?

我在 python 中启动 zeroRPC 服务器时遇到问题。我是按照official example做的,但是当我调用运行()方法时,它会死循环,所以我的程序在启动这个服务器后无法继续。我试图在新线程中 运行 它,但出现以下异常:

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

我真的不知道怎么解决。有什么想法吗?

简而言之,您不能将 os 个线程与 zerorpc 一起使用。

更长的答案:zerorpc-python 使用 gevent 进行 IO。这意味着您的项目必须使用 gevent 并与之兼容。本机 OS 线程和 gevent 协程(也称为 greenlet、green threads 等)并不是真正的朋友。

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

您不能在其中生成原生 OS 线程和 运行 gevent 协程(包括 zerorpc)。

如果你所做的一切都与 gevent 协程一起工作,那么不是 运行 在本机线程中 run(),运行 它在 gevent coroutine/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 不是一个选项,一个解决方案是实现一个不使用 gevent 并在 Python 之外实现其 IO 的 zerorpc-python 版本,但是这有一个有趣的并发症,而且不会很快发生。