2017-12-24 33 views
0

zmqソケットを持つtcpサーバーを作成したいと思います。次のコードは、Pythonのasyncioのioloopを使ってzmqソケットを使ってtcpサーバーを作成します。asyncio ioloopとpyzmqの使用

次のコードでは、着信接続を待機するzmqソケットを作成しています。コルーチンrecv_and_processは、接続をリッスンし、着信接続に応答するwhileループを持つソケットを作成します。

私の質問は、whileループを排除し、その代わりに元のasyncio event loopを使用する方法ですか?

import asyncio 
import zmq 
import zmq.asyncio 

zmq.asyncio.install() 
ctx = zmq.asyncio.Context() 

@asyncio.coroutine 
def recv_and_process(): 
    sock = ctx.socket(zmq.PULL) 
    sock.bind('tcp://127.0.0.1:8888') 
    while True: 
     msg = yield from sock.recv_multipart() # waits for msg to be ready 
     print(msg) 

if __name__ == '__main__': 

    loop = asyncio.get_event_loop() 
    loop.run_until_complete(recv_and_process()) 
+0

無限のwhileループを配置することは、繰り返し何かを行うコルーチンの一般的なパターンです。私が知っているように、イベントループが単独で作業を委任するオプションはありません。 – SangminKim

答えて

1

私はここにいくつかの考え、私はあなたが欲しいものを理解わからないんだけど、私たちが「asyncioイベントループを」と言うとき、私たちはあなたのスクリプトでコルーチンを実行し、いくつかのグローバルオブジェクトを意味します。すでにこのイベント・ループを使用しているのは、コルーチンrecv_and_processが行loop.run_until_complete(recv_and_process())で終了するまでです。

coroutinesを実行するためのasyncioイベントループを実行しても、プログラムには平文文が含まれていてはいけません。whileループ文。 whileループは、いつもと同じ目的で使用することができます。たとえば、何かのコルーチンがあなたのケースで待っているなど、繰り返し何かを行うことができます。

関連する問題