Python異步async/await概念、用法(二)

  • Python中的函數類型

    Python中有四種常見函數類型:

    # 1. 普通函數 FunctionType
    def function():
        return 1
    # 2. generator function :GeneratorType
    def generator():
        yield 2   # 生成器
    
    # async修飾將普通函數和生成器函數包裝成異步函數和異步生成器
    # 3. 異步函數(協程) :CoroutineType
    async def async_function():
        return 3
    # 4. 異步生成器 : AsyncGeneratorType
    async def async_function():
        yield 4
    
  • 異步函數

    直接調用異步函數不會返回結果,而是返回一個coroutine對象。

    協程需要通過其他方式來驅動,可以通過這個協程對象的send方法給協程發送一個值

    在協程函數中,可以通過await語法來掛起自身的協程,並等待另一個協程完成直到返回結果。

    async def async_function():
        return 1
    async def await_coroutine():
        result = await async_function()   # await只能出現在通過async修飾的函數中;其後是一個awaitable
        print(result)
    run(await_coroutine())
    
  • awaitable類

    實現了__await__方法的類。

  • AsyncGenerator

    需要實現__aiter__、__anext__兩個核心方法,以及asendathroaclose方法。

  • async/await語法

    完成異步的代碼不一定要用async/await

    使用了async/await的代碼也不一定能做到異步;

    async/await是協程的語法糖,使協程之間的調用變得更加清晰:

    • 使用async修飾的函數調用時會返回一個協程對象;
    • await只能放在async修飾的函數裏面使用;
    • await後面必須要跟着一個協程對象或者Awaitable;
    • await的目的是等待協程控制流的返回;
    • 實現暫停並掛起函數的操作的是yield;
  • async作用

    常規函數開始執行後一直運行到return實現退出,如果需要能夠中斷的函數,就需要添加async關鍵字。

    async用來聲明一個函數爲異步函數,異步函數的特點就是能在函數執行過程中被掛起,去執行其他異步函數,等掛起條件消失後再回來執行。

  • await作用

    await用來聲明程序掛起。

    await後面只能跟異步程序或有__await__屬性的對象。

    兩個異步程序async a、async b:

    1. a中一步有await,當程序碰到關鍵字await b後;
    2. 異步程序a掛起,去執行異步b程序(就相當於從一個函數內部跳出去執行其他函數);
    3. 當掛起條件小時候,不管b是否執行完,要馬上從b程序中跳出來,回到原程序a執行原來的操作;

    如果await後面跟的b函數不是異步函數,那麼操作就只能等b執行完再返回,無法在b執行的過程中返回,這樣就相當於直接調用b函數,沒必要使用await關鍵字了。

    因此,需要await後面跟的是異步函數。

  • Reference

  1. Python Async/Await入門指南
  2. 對python async與await的理解
  3. Python併發之異步I/O(async,await)
  4. 輕鬆理解 Python 中的 async await 概念
  5. 廖雪峯的官方網站:async/await
  6. Coroutines and Tasks
  7. Python黑魔法 — 異步IO( asyncio) 協程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章