1

同じループ内の他の gevent greenlet と一緒に、zeroRPC サーバーを 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() メソッドは、(zeropc) サーバーのセットアップ、必要に応じてサブグリーンレットの生成と管理を行います。これは効果的に greenlet のツリーを作成し、致命的なエラーを .run() メソッドに戻します。zerorpc サーバーは、.run() メソッドが所有する greenlet のツリーから生成された、新しい greenlet で着信要求を実行します。

ブロッキング .run() メソッドを使用すると、単純な try/catch で .run() によって発生したエラーを処理できます。さらに、.run() が戻ると、zerorpc サーバーが完全に停止していることを意味します。たとえば、別の greenlet から .stop() を呼び出すと、zerorpc サーバーは新しいリクエストの受け入れを停止し、.run() から戻る前にアクティブなリクエストの処理を終了します。

于 2014-01-15T20:17:57.013 に答える