2016-08-12 9 views
2

イベントループが既に実行中のasyncio.Serverインスタンスを実行することが可能ですか?run_foreverメソッド(別スレッド、 もちろん)。 私が理解しているように、サーバーは、ループが既に実行されている場合は、loop.run_until_complete(asyncio.start_server(...))または await asyncio.start_server(...)のいずれかで開始できます。 ループはすでにrun_foreverメソッドによって実行されているので、最初の方法は私には受け入れられません。しかし、私は "ループ領域"の外側から(つまり、メインメソッドから、非同期としてマークすることはできません)、それを開始しようとしているので、表現を待つことはできません。イベントループが既に実行されている間にasyncio.Serverインスタンスを実行することは可能ですか

ソースの中で、最も簡単な解決策は、テストを開始する前に(ループを実行して)すべてのルータ(サーバ)を追加することです。しかし、私はそれを実装しようとするので、テストがすでに実行されているときにルータを追加することは可能です。私はloop.call_sooncall_soon_threadsafe)の方法は私を助けることができると思ったが、それはコルーチンをsheduleできないようだが、単純な機能。

私の説明があまり混乱しないことを願っています。前もって感謝します!

答えて

1

あるスレッドで実行されたイベントループと、他のスレッドで実行されていた従来の古い正常なスレッドコードとの通信には、janusライブラリを使用することができます。

これは、非同期とスレッドセーフ同期の2つのインターフェイスを持つキューです。

これは使用例です:

import asyncio 
import janus 

loop = asyncio.get_event_loop() 
queue = janus.Queue(loop=loop) 

def threaded(sync_q): 
    for i in range(100): 
     sync_q.put(i) 
    sync_q.join() 

@asyncio.coroutine 
def async_coro(async_q): 
    for i in range(100): 
     val = yield from async_q.get() 
     assert val == i 
     async_q.task_done() 

fut = loop.run_in_executor(None, threaded, queue.sync_q) 
loop.run_until_complete(async_coro(queue.async_q)) 
loop.run_until_complete(fut) 

あなたがループ内でキューから新しいメッセージを待っていると、要求に応じて新しいサーバーを起動するタスクを作成することがあります。他のスレッドは新しいメッセージをキューにプッシュして新しいサーバーを要求することがあります。

+0

ありがとうございます!それは私が探しているようだ。 –

関連する問題