2016-04-15 9 views
1

私は、(竜巻)ウェブサーバで長いCPU集約型タスクを実行しています。私はスレッドにこのタスクをオフロードしたくない(今のところ)。この長時間実行されているタスクの制御をイベントループに正しく "もたらす"ため、Webリクエストはまだ配信されています(注:ジェネレータセンスではなく、協調スケジューリングの意味で "yield"を使用しています、またはpythonキーワードyield)。asyncioの協調歩留り

私の提案はawait asyncio.sleep(0)ですが、これは単にNOPとして実装されているという保証はありませんか?私はこれを行うasyncioライブラリの専用関数を探していましたが、これまでのところ見つけられませんでした。

例(のpython 3.5は、非同期/スタイルを待つ):

async def long_task(): 
    for i in range(LARGE_NUMBER): 
     do_something(i) 
     if i % 100 == 0: 
      await asyncio.sleep(0) 

答えて

1

それは、docで言及しませんが、現在asyncio.sleep(0)はこれを行うための一般的な方法です。あなたは完全な議論hereを読むことができます。さらに、asyncio.sleep(0)は仕事を行うのに特にoptimizedでした。このケースhas test以来、私はあなたが行動を恐れないかもしれないと思います。

+0

完璧!私が探していた正確な議論にリンクしています。 BDFLがこれを行う方法だと言っている限り、私はそれに満足しています:)。 – Claude