gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:48:39 26 4
gpt4 key购买 nike

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

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

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

最佳答案

简而言之,您不能将操作系统线程与 Zerorpc 一起使用。

更长的答案:zerorpc-python 使用 gevent 进行 IO。这意味着您的项目必须使用 gevent 并与其兼容。 native 操作系统线程和 gevent 协程(也称为 greenlet、绿色线程等)并不是真正的 friend 。

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

您无法生成 native 操作系统线程并在其中运行 gevent 协程(包括 Zerorpc)。

如果您所做的所有工作都使用 gevent 协程,那么不要在 native 线程中运行 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 不是一个选项,解决方案是实现一个不使用 gevent 的 Zerorpc-python 版本,并在 Python 之外实现其 IO,但这有一个有趣的复杂性,并且不会很快发生.

关于python - 如何在Python中的线程中运行zeroRpc服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com