我在python中启动zeroRPC服务器时遇到问题。我根据official example做了,但是当我调用run()方法时,它无限循环,所以我的程序在启动此服务器后无法继续。我尝试在新线程中运行它,但我得到以下异常:
LoopExit: ('This operation would block forever', <Hub at 0x7f7a0c8f37d0 epoll pending=0 ref=0 fileno=19>)
我真的不知道如何修复它。有什么想法吗?
答案 0 :(得分:2)
简而言之,您不能将os线程与zerorpc一起使用。
更长的答案:zerorpc-python将gevent用于IO。这意味着您的项目必须使用gevent并与之兼容。本机操作系统线程和gevent协同程序(也称为greenlet,绿色线程等)并不是真正的朋友。
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不是一个选项,一个解决方案是实现一个zerorpc-python版本,它不使用gevent并在Python之外实现它的IO,但这有一个有趣的复杂性,并且它不会很快发生