最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python asyncio常用函數(shù)使用詳解

 更新時(shí)間:2023年03月14日 10:19:24   作者:拾牙慧者  
Asyncio在經(jīng)過(guò)一段時(shí)間的發(fā)展以及獲取Curio等第三方庫(kù)的經(jīng)驗(yàn)來(lái)提供更多的功能,目前高級(jí)功能也基本完善,但是相對(duì)于其他語(yǔ)言,Python的Asyncio高級(jí)功能還是不夠的,但好在Asyncio的低級(jí)API也比較完善

協(xié)程的定義

需要使用 async def 語(yǔ)句

協(xié)程可以做哪些事:

1、等待一個(gè)future結(jié)果

2、等待另一個(gè)協(xié)程(產(chǎn)生一個(gè)結(jié)果或引發(fā)一個(gè)異常)

3、產(chǎn)生一個(gè)結(jié)果給正在等它的協(xié)程

4、引發(fā)一個(gè)異常給正在等它的協(xié)程

協(xié)程的運(yùn)行

調(diào)用協(xié)程函數(shù),協(xié)程不會(huì)開(kāi)始運(yùn)行,只是返回一個(gè)協(xié)程對(duì)象

要讓協(xié)程對(duì)象運(yùn)行有兩種方式:

1、在另一個(gè)已經(jīng)運(yùn)行的協(xié)程中用await等待它

2、通過(guò)ensure_future函數(shù)計(jì)劃它的執(zhí)行

只有某線程的loop運(yùn)行了,協(xié)程才可能運(yùn)行

下面的例子:

先拿到當(dāng)前線程缺省的loop,然后將協(xié)程對(duì)象交給loop.run_until_complete,協(xié)程對(duì)象隨后會(huì)在loop里得到運(yùn)行

loop = asyncio.get_event_loop()
loop.run_until_complete(do_some_work(3))

run_until_complete是一個(gè)阻塞調(diào)用,知道協(xié)程運(yùn)行結(jié)束才返回

它的參數(shù)是一個(gè)future,但是我們傳給它的卻是協(xié)程對(duì)象,它在內(nèi)部做了檢查,通過(guò)ensure_future函數(shù)把協(xié)程對(duì)象包裝成了future

我們可以這樣寫(xiě):

loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))

多個(gè)協(xié)程運(yùn)行

多個(gè)協(xié)程在一個(gè)loop里運(yùn)行,為了把多個(gè)協(xié)程交給loop,需要借助asyncio.gathre函數(shù)

loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))

或者先將協(xié)程對(duì)象存到list中,這種比較常見(jiàn)

loop = asyncio.get_event_loop() #獲取當(dāng)前線程loop
coros_list = []
for i in range(2000):
    coros_list.append(main(i))
loop.run_until_complete(asyncio.gather(*coros_list))

gather 起聚合的作用,把多個(gè) futures 包裝成單個(gè) future,因?yàn)?loop.run_until_complete 只接受單個(gè) future。

關(guān)于loop.close()

簡(jiǎn)單來(lái)說(shuō),loop 只要不關(guān)閉,就還可以再運(yùn)行。:

loop = asyncio.get_event_loop() #獲取當(dāng)前線程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.run_until_complete(do_some_work(loop, 3))
loop.close()

但是如果關(guān)閉了,就不能再運(yùn)行了:

loop = asyncio.get_event_loop() #獲取當(dāng)前線程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.close()
loop.run_until_complete(do_some_work(loop, 3))  # 此處異常

回調(diào)

加入?yún)f(xié)程是一個(gè)IO的讀操作,等他讀完數(shù)據(jù)后,我們希望得到通知,以便下一步數(shù)據(jù)的處理。這個(gè)可以向future添加回調(diào)實(shí)現(xiàn)

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)

事件循環(huán)

事件循環(huán)會(huì)運(yùn)行異步任務(wù)和回調(diào),執(zhí)行網(wǎng)絡(luò)IO操作,以及運(yùn)行子進(jìn)程

從asyncio event loop policy文檔,我們得知, event loop policy是一個(gè)進(jìn)程全局對(duì)象,控制對(duì)該進(jìn)程內(nèi)所有event loop的管理。

進(jìn)程的全局policy定義了該policy管控的context的含義,在每個(gè)context中管理分開(kāi)獨(dú)立的event loop. 默認(rèn)的policy定義的context就是當(dāng)前的線程, 也就是說(shuō)不同的線程是不同的context,因此有不同的event loop。

獲取事件循環(huán)

asyncio.get_running_loop() # 返回當(dāng)前os線程中正在運(yùn)行的事件循環(huán)
asyncio.get_event_loop() # 獲取當(dāng)前事件循環(huán)
asyncio.set_event_loop(loop) # 獲取當(dāng)前事件循環(huán)
asyncio.new_event_loop() # 創(chuàng)建并返回一個(gè)新的事件循環(huán)對(duì)象

asyncio.get_event_loop()

若:

  • 當(dāng)前線程為主線程
  • 當(dāng)前線程沒(méi)有啟動(dòng)event loop

調(diào)用asyncio.get_event_loop()方法會(huì)生成一個(gè)新的默認(rèn)event loop,并設(shè)置為當(dāng)前線程的事件循環(huán)。

此時(shí),get_event_loop()相當(dāng)于:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

到此這篇關(guān)于Python asyncio常用函數(shù)使用詳解的文章就介紹到這了,更多相關(guān)Python asyncio內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

类乌齐县| 玉溪市| 梧州市| 泰兴市| 海口市| 留坝县| 茂名市| 东源县| 凭祥市| 汉寿县| 连云港市| 溧阳市| 巴东县| 天峨县| 大姚县| 景宁| 敦煌市| 孙吴县| 临泉县| 洪泽县| 定州市| 子洲县| 上蔡县| 大城县| 从化市| 鸡西市| 晴隆县| 青浦区| 阿勒泰市| 天等县| 山东| 仁寿县| 德惠市| 夏邑县| 陇西县| 大新县| 平塘县| 婺源县| 湟中县| 富裕县| 庆云县|