this質問をする必要があります。コールバックと同期待ちの束なしで、別のスレッドからasyncioコルーチンをスケジューリングする
メッセージを送信するコルーチンsend
があります。私は(スレッド2で実行されている)loop2
から(スレッド1で実行されている)loop1
でそれをスケジュールする:
async def send_threadsafe(self, message, current_loop=loop2, dest_loop=loop1):
future = asyncio.run_coroutine_threadsafe(
send(message), loop=dest_loop
)
asyncio.run_coroutine_threadsafe
によって返さfuture
がconcurrent.futures.Future
で、非同期的に待っていたことができません。
質問:私はどのようにしてfuture
を適切に待っていますか、または待ち受けできるオブジェクトを取得するためにsend
をどのようにスケジュールする必要がありますか?
私は私が行うことができます知っている:
async def send_threadsafe(...):
future = ...
result = await current_loop.run_in_executor(None, future.result)
しかし、別のスレッドを使用せずにそれを行う方法はありますか? run_in_executor
はfuture.result
をスレッドプールに送信するので、私はそのスレッドプールを利用したくありません。
私がcall_soon_threadsafe
を使用したくない理由は、いくつかのコールバックを作成する必要があるからです。まず、send
の実行をloop1
にスケジュールする。次にsend
をloop1
に実行し、3番目のコールバックをloop2
にスケジュールします。第3に、asyncio futureがスレッドセーフではなく、結果をloop1
に設定できないため、最初のコールバックで作成された未来に結果を設定することです。
ありがとう、これは私が探していたものです!ちなみに、最初の例では、 'def send_threadsafe()'は 'def send_threadsafe()'であるべきではありませんか? – Zelta
@ZeltaOops、修正されました! – Vincent