[Python]非同期処理とasyncio

8801 ワード

非同期処理


  • 呼び出された関数が完了していない場合でも、呼び出された関数に戻り、バックグラウンドで実行されます.その後、関数操作が完了すると、呼び出された関数が完了したことが通知されます.

  • I/O関連のタスクを実行すると、CPUが待機し、他のデバイスがタスクを実行します.非同期処理の目的は,空きCPUの時間を短縮し,プログラムの性能を向上させることである.
  • asyncioライブラリ

  • asyncioはPythonにおける非同期プログラミング可能な標準ライブラリである.
  • async & await


  • 既存のdef関数のキーワードにasyncキーワードを付けて非同期関数を生成します.
    async def func():
     return
  • awaitは、非同期関数を呼び出すキーワードです.通常の関数を呼び出すように、非同期関数を呼び出すとcoutinオブジェクトが返されます.

  • 最初のオブジェクトではなく、関数の戻り値を返すには、awaitキーワードを使用する必要があります.このキーワードは、特定のオブジェクトの終了を待つ役割を果たします.
    import asyncio
     
     async def ffcc(i):
        print(i)
        return i
    
     a = ffcc(3)
     print(a)

  • Corutine & Subroutine


  • coluceneはPythonでasyncによって生成される非同期関数オブジェクトである.

  • イベントループ制御権を付与することで、タスクが待機または遅延した部分で次のタスクを行うことができ、応答が再び受信されると、既存の状態を維持し、停止した部分からタスクを実行することができる.

  • 非コルディンの一般的な関数をサブプログラムと呼ぶ.
  • event loop


  • イベントループは、タスクをループで順次実行する役割を果たします.

  • タスクが要求され、データが待機している場合、制御権はイベントループに渡され、イベントループはそのループの次のタスクを実行します.

  • 保留中のタスクが完了したという応答を受信した場合は、停止した部分から制御権を再所有します.
  • asyncio.get_event_loop() :
    現在のイベントループの関数を返します.(イベントループを定義します.)
    asyncとして宣言されていない通常の関数が非同期関数を呼び出すにはevent loopを使用する必要があります.
  • loop.run_until_complete(future) :
    futureインスタンスが完了するまでイベントループ(async関数)を実行します.
    将来の結果を返す.
  • asyncio.Future :
    非同期演算の最終結果を表すオブジェクト.
  • asyncio.gather() :
    複数の関数を同時に呼び出すために使用します.
    loop.run_until_complete(asyncio.gather(coroutine_1(),coroutine_2()))
  • asyncio.run() :
    非同期関数の関数を簡単に呼び出します.Python 3.7以上からご利用いただけます.
  • asyncio.wait() :
    複数の関数をリストに入れて呼び出します.
    async def start_coroutine():
       await asyncio.wait([                          
           coroutine_1(),
           coroutine_2()
       ])
       
    asyncio.run(start_coroutine())
  • loop.close() :
    アクティビティサイクルを終了します.
  • await asyncio.sleep(1)特定の時間に待機する非同期関数.したがって,`awaitキーワードとともに使用される.
  • 同期関数からasync関数を呼び出す


  • event loop呼び出しの使用
    async def ffcc(i):
       print(i)
       return i
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(ffcc(3))
    loop.close()
    
    # 출력결과: 3
  • async関数からasync関数を呼び出す

  • awaitキーワードを使用します.
    async def ffcc(i):
       print(i)
       return i
    
     async def ffbb():
       a = await ffcc(3)
       print(f"a: {a}")
    
     loop = asyncio.get_event_loop()
     loop.run_until_complete(ffbb())
     loop.close()
     
     #출력 결과:
     #3
     #a: 3
  • Reference


  • https://leo-bb.tistory.com/54

  • https://monkey3199.github.io/develop/python/2018/12/04/python-pararrel.html

  • https://velog.io/@nameunzz/thread-threading

  • https://ffoorreeuunn.tistory.com/462

  • https://www.daleseo.com/python-asyncio/

  • https://jammdev.tistory.com/37