2016-10-18 5 views
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_threadsafecall_later_threadsafeが実装されている理由についての情報の一部を見つけることができませんでした。理由は存在するのでしょうか?

答えて

4

単にloop.call_laterをスケジュールするloop.call_soon_threadsafeを使用します。

loop.call_soon_threadsafe(loop.call_later, 1, print, 'bomb') 
+0

をが、これは実行速度がそれではありません鈍化? call_laterをループに提出する必要があるので、call_later submit print ...... – SpringMaple

+2

@SpringMapleこれは時期尚早の最適化のようです。あなたのプログラムが正しく書かれている限り(例えば、ブロッキングコールなし)、コールバックは効果的に「すぐに」呼び出されます。しかし、私は '_write_to_self'の選択肢が受け入れられると思います。 – Vincent

+1

あなたが貢献したrun_coroutine_threadsafeは、ループケース(loop.callate_threadsafe(loop.create_task(coro))を使用できるので、loop.call_later_threadsafeと同じコンセプトだと思っていました) (非同期ループが実行され、結果を別のスレッドから返すのを待つ)、これは以前には実現できなかったと思った。おかげさまで、2つの質問で新しいことを学びました。 – SpringMaple

関連する問題