我在 python 中启动 zeroRPC 服务器时遇到问题。我是按照官方的例子做的,但是当我调用 run() 方法时,它在无限循环中工作,所以我的程序在启动这个服务器后无法继续。我试图在新线程中运行它,但出现以下异常:
LoopExit: ('This operation would block forever', <Hub at 0x7f7a0c8f37d0 epoll pending=0 ref=0 fileno=19>)
我真的不知道如何解决它。有什么想法吗?
简而言之,您不能将 os 线程与 zerorpc 一起使用。
更长的答案:zerorpc-python 使用 gevent 进行 IO。这意味着您的项目必须使用 gevent 并与之兼容。本机操作系统线程和 gevent 协程(也称为 greenlet、green 线程等)并不是真正的朋友。
gevent ( http://www.gevent.org/gevent.threadpool.html ) 中有一个本地线程池选项。
您不能生成本机操作系统线程并在其中运行 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 版本,但这有一个有趣的复杂性,而且不会很快发生。