1
私はWindows 32ビットでPython 3.5.2を使用しており、asyncio call_atはスレッドセーフではないことを認識しています。したがって、loop._write_to_self()
という行のコメントを解除しない限り、次のコードは 'bomb'なぜcall_at_threadsafeとcall_later_threadsafeはありませんか?
import asyncio
import threading
def bomb(loop):
loop.call_later(1, print, 'bomb')
print('submitted')
# loop._write_to_self()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
threading.Timer(2, bomb, args=(loop,)).start()
loop.run_forever()
は、しかし、私はcall_at_threadsafe
とcall_later_threadsafe
が実装されている理由についての情報の一部を見つけることができませんでした。理由は存在するのでしょうか?
をが、これは実行速度がそれではありません鈍化? call_laterをループに提出する必要があるので、call_later submit print ...... – SpringMaple
@SpringMapleこれは時期尚早の最適化のようです。あなたのプログラムが正しく書かれている限り(例えば、ブロッキングコールなし)、コールバックは効果的に「すぐに」呼び出されます。しかし、私は '_write_to_self'の選択肢が受け入れられると思います。 – Vincent
あなたが貢献したrun_coroutine_threadsafeは、ループケース(loop.callate_threadsafe(loop.create_task(coro))を使用できるので、loop.call_later_threadsafeと同じコンセプトだと思っていました) (非同期ループが実行され、結果を別のスレッドから返すのを待つ)、これは以前には実現できなかったと思った。おかげさまで、2つの質問で新しいことを学びました。 – SpringMaple