2017-07-31 14 views
1

asyncioとスレッドを同じPythonプロジェクトで使用すると、asyncioのいくつかが非同期アクティビティのコードを順番に取得するために使用される異なるスレッドでコードが実行されるようになりますか?asyncioとスレッドを使用する

これを実行しようとすると、スレッディングまたはasyncioの使用に関するいくつかの基本的な概念が欠落していますか?

+0

関連:[asyncioのユーザーマニュアル]の[スレッド](http://asyncio.readthedocs.io/en/latest/threads.html)(http://asyncio.readthedocs.io/ja/latest/index .html)。 – Vincent

答えて

1

確かに意味があるかもしれません。

非同期コードは原則として同じスレッドで一連のルーチンを実行します。

これは瞬間1つのルーチンは、など

マルチを、それはそのルーチンを一時的に停止します入力または出力(I/O)を待つ必要があり、単にそれが待ちに遭遇するまで、別のルーチンの処理を開始することを意味しますスレッドコードは、マシンの異なるコアに同時にので実行されます。

両方のプログラムを同じプログラムで使用することは理にかなっています。 I/Oを待つ間、処理を続けるためにasyncioを使用してください。たとえば、プログラムの別の部分で重い計算を並行して実行するために、マルチスレッドを使用します。

0

私はあなたが何を求めているのか理解できませんでした(非同期アクティビティのコードを順番に探しています)が、答えがないので、私はいくつかの考えを書いています。

なぜasyncio /スレッドが必要なのか話しましょう。 2つの要求をするというタスクがあるとします。

  1. 我々は、プレーン1スレッド非非同期コードを使用する場合は、私たち ための唯一のオプションは、1つのURLに対する要求を行うことで、それが行わだ後にのみ - 別のために:

    request(url1) 
    request(url2) 
    

    問題ここでは、私たちは仕事を無効にするということです。各機能の実行時間は、ネットワークの結果を待っているだけです。最初の要求がネットワークに詰まっていて、それを必要としない間に何とか2番目の要求にCPUを使うことができれば、涼しいでしょう。

  2. この問題は、異なるスレッドで関数を実行することによって解決(通常は解決)することができます:我々は、より速く、このように結果を得るでしょう

    with ThreadPoolExecutor(max_workers=2) as e: 
        e.submit(request, url1) 
        e.submit(request, url2) 
    

    。最初のリクエストはネットワークに陥っていますが、CPUは別のスレッドで2番目のリクエストに役立つ何かを行うことができます。

    これは理想的な解決策ではありません。スレッド間の切り替えにはコストがかかります。実行フローは、最初の例より複雑です。

    良い方法があります。

    await asyncio.gather(
        async_request(url1), 
        async_request(url2), 
    ) 
    

    イベントループの実行フローを管理します:最初のコルーチンは、いくつかのI/O操作やCPUをするために使用することができ達したときに、他の機能の実行を開始する

  3. 使っ一つの機能のアイドル期間は、一般的な程度でasyncioは何ですか別のコルーチンが始まります。後でイベントループが戻り、最初のコルーチンが実行されたままになります。

    「並列」な要求とわかりやすいコードが得られます。単一スレッドで並列化が行われるため、別のスレッドは必要ありません。

実際には、asyncioスレッドを使用すると、まだ便利です。彼らのために支払うために、我々は準備ができている場合、彼らは非常に迅速に非同期と同期I/O機能をキャストするために私たちをhelpことができます。

async def async_request(url): 
    loop = asyncio.get_event_loop() 
    return (await loop.run_in_executor(None, request, url)) 

をしかし、再び、それはオプションだと我々は通常、要求(および他のIを作るためのモジュールを見つけることができます/ Oタスク)をスレッドなしで非同期に実行できます。

スレッドが非同期プログラムで役に立ちそうな場合、私は他のタスクに直面しませんでした。

+0

これはalgo取引の文脈の中で、(私が正しく理解すれば)主なコードのスレッド以外のスレッドでコールバックを行う、InteactiveブローカーのPython TWS APIを使用しています。私はPythonに慣れていないし、環境内で何かをする最良の方法を理解しようとしており、複数のスレッドとasyncIO(1つのスレッドで実行される)の関係について混乱しています。 – epeleg

関連する問題