需要使用async def 語句
協程可以做哪些事:
1、等待一個future結果
2 、等待另一個協程(產生一個結果或引發一個異常)
3、產生一個結果給正在等它的協程
4、引發一個異常給正在等它的協程
呼叫協程函數,協程不會開始運行,只是傳回一個協程物件
要讓協程物件運行有兩種方式:
1、在另一個已經運行的協程中用await
等待它
2、透過ensure_future
函數來規劃它的執行
只有某執行緒的loop運行了,協程才可能運行
下面的例子:
先拿到目前執行緒缺省的loop,然後將協程對象交給loop.run_until_complete,協程物件隨後會在loop裡得到運行
loop = asyncio.get_event_loop() loop.run_until_complete(do_some_work(3))
run_until_complete
是一個阻塞調用,知道協程運行結束才返回
它的參數是future,但是我們傳給它的卻是協程對象,它在內部做了檢查,透過ensure_future函數把協程對象包裝成了future
我們可以這樣寫:
loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))
多個協程在一個loop裡運行,為了把多個協程交給loop,需要藉助asyncio.gathre
函數
loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))
或先將協程物件存到list中,這種比較常見
loop = asyncio.get_event_loop() #获取当前线程loop coros_list = [] for i in range(2000): coros_list.append(main(i)) loop.run_until_complete(asyncio.gather(*coros_list))
gather 起聚合的作用,把多個futures 包裝成單一future,因為loop.run_until_complete 只接受單一future。
簡單來說,loop 只要不關閉,就還可以再運作。 :
loop = asyncio.get_event_loop() #获取当前线程loop loop.run_until_complete(do_some_work(loop, 1)) loop.run_until_complete(do_some_work(loop, 3)) loop.close()
但是如果關閉了,就不能再運行了:
loop = asyncio.get_event_loop() #获取当前线程loop loop.run_until_complete(do_some_work(loop, 1)) loop.close() loop.run_until_complete(do_some_work(loop, 3)) # 此处异常
def done_callback(futu): print('Done') futu = asyncio.ensure_future(do_some_work(3)) futu.add_done_callback(done_callback) loop.run_until_complete(futu)事件循環事件循環會執行非同步任務和回調,執行網路IO操作,以及執行子程序從asyncio event loop policy文檔,我們得知, event loop policy是一個進程全域對象,控制對該進程內所有event loop的管理。 進程的全域policy定義了該policy管控的context的含義,在每個context中管理分開獨立的event loop. 預設的policy定義的context就是當前的線程, 也就是說不同的線程是不同的context,因此有不同的event loop。 取得事件循環
asyncio.get_running_loop() # 返回当前os线程中正在运行的事件循环 asyncio.get_event_loop() # 获取当前事件循环 asyncio.set_event_loop(loop) # 获取当前事件循环 asyncio.new_event_loop() # 创建并返回一个新的事件循环对象
asyncio.get_event_loop()若:
此時,get_event_loop()相當於:
loop = asyncio.new_event_loop() asyncio.set_event_loop(loop)
以上是如何使用Python的asyncio常用函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!