2016-07-23 5 views
0

私はPythonでzeroRPCサーバーを起動する際に問題があります。私はofficial exampleに従ってそれを行いましたが、run()メソッドを呼び出すと無限ループで動作しますので、このサーバを起動してからプログラムを続行できません。私は新しいスレッドでそれを実行しようとしたが、私は例外次のようだ:Pythonでスレッド内のzeroRpcサーバーを実行するにはどうすればよいですか?

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

私は本当にそれを修正する方法がわかりません。アイデアはありますか?

+1

私はこれが何のために誤解してしまったと思いますか?もちろんブロックされ、メッセージを受け取るのを待っています。なぜあなたはプログラムを「続行しますか? –

+0

それは大きなプロジェクトであり、第2面とのコミュニケーションはそれの一部です。私は自分のスレッドで動作するHW(arduino)と通信し、すべての通信はメインスクリプトで制御する必要があります。私は分かりません。多分アプリケーションデザインが悪いのですが、どうすればいいと思いますか? @DanielRoseman –

答えて

1

要するに、osスレッドをzerorpcで使用することはできません。

長い答え:zerorpc-pythonはIOにgeventを使用します。つまり、あなたのプロジェクトはgeventを使用し、それと互換性がなければなりません。ネイティブOSスレッドとジワントコルーチン(グリーンレット、グリーンスレッドなどとも呼ばれます)は本当は友人ではありません。

gevent(http://www.gevent.org/gevent.threadpool.html)には、ネイティブスレッドプールオプションがあります。

ネイティブOSスレッドを生成してそこにgeentコルーチン(zerorpcを含む)を実行することはできません。

あなたはgeventコルーチンと作品をやっているすべては、その後、代わりにネイティブスレッドで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を使用せずPythonの外部にIOを実装するzerorpc-pythonのバージョンを実装することですが、これは面白い複雑さがあり、すぐには起こりません。

関連する問題