1

我想将 zeroRPC 服务器作为 greenlet 与其他 gevent greenlet 在同一循环中运行。ZeroRPC 的文档有点轻。这是启动 zeroRPC 服务器的建议方法:

s = zerorpc.Server(Cooler())
s.bind("tcp://0.0.0.0:4242")
s.run()

要将服务器作为greenlet 运行,我将运行包装在greenlet 中:

s = zerorpc.Server(Cooler())
s.bind("tcp://0.0.0.0:4242")
gevent.spawn(s.run)

# More code and greenlets started.
# ...

不过好像有点别扭,考虑到zeroRPC已经是基于gevent的,而且gevent框架中的其他服务器都有非阻塞的启动方式。

有一个更好的方法吗?

4

1 回答 1

1

这是最好的方法。

.run() 方法将负责设置(zerorpc)服务器,根据需要生成和管理任何子greenlets。这有效地创建了一棵 greenlet 树,将任何致命错误冒泡回 .run() 方法。zerorpc 服务器将在一个新的 greenlet 中运行任何传入请求,该 greenlet 是从 .run() 方法拥有的 greenlet 树生成的。

拥有一个阻塞的 .run() 方法可以让你通过一个简单的 try/catch 来处理 .run() 引发的错误。此外,当 .run() 返回时,这意味着 zerorpc 服务器已完全停止。例如,当您从另一个 greenlet 调用 .stop() 时,zerorpc 服务器将停止接受新请求并在从 .run() 返回之前完成对活动请求的处理

于 2014-01-15T20:17:57.013 回答