Asyncio
1. Base Event Loop
-
BaseEventLoop類
不應(yīng)該被直接調(diào)用或被放在第三方包中調(diào)用(使用AEL代替),BEL屬于AbstractEventLoop
-
AbstractEventLoop類
抽象的基類,非線程安全
1.1 Run an event loop
1.1.1 AbstractEventLoop.run_forever()
會一直運行直到stop()方法觸發(fā)
1.1.2 AbstractEventLoop.run_until_complete(future)
會一直運行直到Future運行結(jié)束,如果是一個協(xié)程對象,就會被ensure_future()來裝飾.
會返回Future的結(jié)果,或者報錯
1.1.3 AbstractEventLoop.is_running()
返回event_loop的運行狀態(tài)
1.1.4 AbstractEventLoop.stop()[3.5.1新增]
會終止run_forever()
在一個合適的時機:
If stop() is called while run_forever() is running, this will run the current batch of callbacks and then exit. Note that callbacks scheduled by callbacks will not run in that case; they will run the next time run_forever() is called.Changed in version 3.5.1.
1.1.5 AbstractEventLoop.is_closed()
3.4.2新增方法 如果event loop被關(guān)閉了 返回True
1.1.6 AbstractEventLoop.close()
徹底關(guān)閉, 這個方法會清除掉executor,并且不會像stop一樣在恰當時機關(guān)閉 而是直接關(guān)閉
不可逆
1.1.7 AbstractEventLoop.shutdown_asyncgens()[coroutine ]
3.6新增方法
try:
loop.run_forever()
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
1.2 Calls | 調(diào)用
大部分異步函數(shù)不接受多個參數(shù),所以調(diào)用的時候 用functools.partial偏函數(shù)來裝飾
- 注意: partial函數(shù)要比lambda表達式要好,因為asyncio包可以識別partial里面的對象并在debug的時候展示,而lambda則不行
1.2.1 AbstractEventLoop.call_soon(callback, *args)
這是一個先進先出的(按注冊順序)隊列
返回asyncio.Handle() 用于控制callback
1.2.2 AbstractEventLoop.call_soon(callback, *args)
和1.2.1一樣 只不過是線程安全的
1.3 Delayed calls | 延時調(diào)用
event loop有他內(nèi)在的時鐘來計算超時[不過 這個延時不能超過一天]
1.3.1 AbstractEventLoop.call_later(delay, callback, *args)
返回asyncio.Handle() 用于控制callback
1.3.2 AbstractEventLoop.call_at(when, callback, *args)
返回asyncio.Handle() 用于控制callback
1.3.3 AbstractEventLoop.time()
返回當前時間,是一個float值(這個是由eventloop的內(nèi)部時鐘給出的)
- asyncio.sleep()方法也用到了這個eventloop的時鐘
1.4 Futures
1.4.1 AbstractEventLoop.create_future()
創(chuàng)建asyncio.Future對象 這個是在asyncio里面創(chuàng)建Future的推薦方法 3.5.2新增方法
1.5. Tasks
1.5.1 AbstractEventLoop.create_task(coro)
設(shè)定協(xié)程對象的執(zhí)行,用future包裹他,返回一個Task對象
第三方包的event_loop可能有他們自己定義的task,但是必須是Task類的子集
3.4.2新增的
1.5.2 AbstractEventLoop.set_task_factory(factory)
如果factory是None, 就會使用默認的
如果factory是可調(diào)用的,需要有一個(loop,coro)的簽名[loop是當前運行的event_loop,coro是一個協(xié)程對象 這個可以調(diào)用的對象一定要返回一個asyncio.Future對象
3.4.4新增
1.5.3 AbstractEventLoop.get_task_factory()
返回當前的task_factory,如果是默認的task_factory類型,就會返回None
3.4.4新增