2017-08-13 10 views
2

タスクが待機期間中にCPUを解放し、他のタスクがそれを使用できるようにするプログラミングスタイル。タスクが(準備ができたら)イベントスケジューラは、これらのタスクをスケジュールする必要があり&履歴書 python asyncIOはどのようにタスクを中断し、再開しますか?

  • を一時停止することが可能であるべき非同期タスク、

    • を導入する

    は、イベントschedulerを書いたが、非同期を有効にするには固執しますtask。タスクがIOバウンドであると仮定します。タスクが同期して実行されるため、スケジューラはタスクの実行中にCPUスライスを取得しません。 ayncio.onSomeIO対応待ちとPythonで


    タスク(bar)、タスクがasyncを使用する場合、(&履歴書を一時停止することが可能)非同期タスクとなり、awaitキーワード

    async def bar(): 
        await asyncio.onSomeIO() 
    

    質問:

    barのパッケージはどのようにasyncioパッケージで、これらのキーワードを含む非同期タスクになりますか?各タスクは別のスレッドで起動されますか?

  • +3

    [Brett Cannonの記事](https://snarky.ca/how-the-heck-does-async-await-work-in-python-3-5/)については、非同期/待機用のボンネットの下にあるもの。非常に深いですが、S/Oで簡単にカバーできるトピックではありません。 – Gavin

    答えて

    2

    各タスクは別のスレッドで起動されますか?

    いいえ、通常asyncioはシングルスレッドで動作します。

    これらの キーワードを使用して、asyncioパッケージでbarを非同期タスクにする方法この関数は__next__()メソッドを使用して、「手順によって」それを実行することができますどのような発電機となりasyncとしてあなたが関数を定義

    await - 実際にyieldyield from)ポイントです。実行フローはすべてのコルーチンの実行を管理するグローバルイベントループに戻ります。

    この単純な例では、あなたが別のジェネレータの実行の流れを切り替えることができます方法を示しています。

    def task(i): 
        yield 1 
        print('task {}: step 1'.format(i)) 
        yield 2 
        print('task {}: step 2'.format(i)) 
    
    
    tasks = [ 
        task(1), 
        task(2), 
        task(3), 
    ] 
    
    
    def execute_tasks(tasks): 
        i = 0 
        finished = [] 
        while True: 
         # start executing tasks: 
         try: 
          tasks[i].__next__() 
         except StopIteration: 
          finished.append(i) 
         # check if any task unfinished: 
         if len(finished) == len(tasks): 
          return 
         # move to next unfinished task: 
         while True: 
          i += 1 
          if i > len(tasks) - 1: 
           i = 0 
          if not i in finished: 
           break 
    
    
    if __name__ == '__main__': 
        execute_tasks(tasks) 
    

    出力:

    task 1: step 1 
    task 2: step 1 
    task 3: step 1 
    task 1: step 2 
    task 2: step 2 
    task 3: step 2 
    

    asyncioもちろんはるかに複雑で、あなたにはるかにすることができます。

    このPyCon 2015ビデオで見たジェネレータを使用してコルーチンを実装する方法については、おそらく最も良い説明はDavid Beazley - Python Concurrency From the Ground Up: LIVE!source code)です。あなたがこれを実装しようとしているなら、間違いなくそれを見るべきです。

    代わりにasyncioを使用するようアドバイスします。既にあなたのために存在しています。あなた自身を発明する必要はありません。

    +0

    'yield 1'の代わりにIOバインド操作をリクエストできますか?私はこのコードを持っています(ここではhttps://github.com/shamhub/DataProcsngAnalytics/tree/master/1_Pipeline_processing)イベントループなし – overexchange

    +0

    @overexchangeビデオからコードを見てみましょう私は上記のリンクを与えましたそこにコードする)。 'run()'そこには実際にはイベントループがあります。 1)I/O操作(43行目)までのタスクの実行を指示します。2)I/O操作でタスクを実行してイベントループ(82,88,94,96行目)に制御を戻します。 I/Oの完了を待つために 'select'を使います(33行目)。 –

    +0

    Pyconプレゼンテーションは素晴らしいです。わからない、どうやって見逃しましたか? – overexchange

    関連する問題