日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:深究Python中的asyncio庫-線程并發(fā)函數(shù)

Asyncio ——gather vs wait

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的哈密網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在Asyncio中不止可以多次使用asyncio.gather,還有另外一個用法是asyncio.wait,他們都可以讓多個協(xié)程并發(fā)執(zhí)行。

那為什么提供2個方法呢?他們有什么區(qū)別,適用場景是怎么樣的呢?我們先看2個協(xié)程的例子:

async def a():
    print('Suspending a')
    await asyncio.sleep(3)
    print('Resuming a')
    return 'A'
async def b():
    print('Suspending b')
    await asyncio.sleep(1)
    print('Resuming b')
    return 'B'

在Ipython里面用gather執(zhí)行一下:

In : return_value_a, return_value_b = await asyncio.gather(a(), b())
Suspending a
Suspending b
Resuming b
Resuming a
In : return_value_a, return_value_b
Out: ('A', 'B')

Ok,asyncio.gather方法的名字說明了它的用途,gather的意思是「搜集」,也就是能夠收集協(xié)程的結(jié)果,而且要注意,它會按輸入?yún)f(xié)程的順序保存的對應(yīng)協(xié)程的執(zhí)行結(jié)果。

接著我們說asyncio.await,先執(zhí)行一下:

In : done, pending = await asyncio.wait([a(), b()])
Suspending b
Suspending a
Resuming b
Resuming a
In : done
Out:
{:1> result='A'>,
 :8> result='B'>}
In : pending
Out: set()
In : task = list(done)[0]
In : task
Out: :8> result='B'>
In : task.result()
Out: 'B'

asyncio.wait的返回值有2項,第一項表示完成的任務(wù)列表(done),第二項表示等待(Future)完成的任務(wù)列表(pending),每個任務(wù)都是一個Task實例,由于這2個任務(wù)都已經(jīng)完成,所以可以執(zhí)行task.result()獲得協(xié)程返回值。

Ok, 說到這里,總結(jié)下它倆的區(qū)別的第一層區(qū)別:

asyncio.gather封裝的Task全程黑盒,只告訴你協(xié)程結(jié)果。

asyncio.wait會返回封裝的Task(包含已完成和掛起的任務(wù)),如果你關(guān)注協(xié)程執(zhí)行結(jié)果你需要從對應(yīng)Task實例里面用result方法自己拿。

為什么說「第一層區(qū)別」,asyncio.wait看名字可以理解為「等待」,所以返回值的第二項是pending列表,但是看上面的例子,pending是空集合,那么在什么情況下,pending里面不為空呢?這就是第二層區(qū)別:asyncio.wait支持選擇返回的時機(jī)。

asyncio.wait支持一個接收參數(shù)return_when,在默認(rèn)情況下,asyncio.wait會等待全部任務(wù)完成(return_when='ALL_COMPLETED'),它還支持FIRST_COMPLETED(第一個協(xié)程完成就返回)和FIRST_EXCEPTION(出現(xiàn)第一個異常就返回):

In : done, pending = await asyncio.wait([a(), b()], return_when=asyncio.tasks.FIRST_COMPLETED)
Suspending a
Suspending b
Resuming b
In : done
Out: {:8> result='B'>}
In : pending
Out: {:3> wait_for=()]>>}

看到了吧,這次只有協(xié)程b完成了,協(xié)程a還是pending狀態(tài)。

在大部分情況下,用asyncio.gather是足夠的,如果你有特殊需求,可以選擇asyncio.wait,舉2個例子:

需要拿到封裝好的Task,以便取消或者添加成功回調(diào)等

業(yè)務(wù)上需要FIRST_COMPLETED/FIRST_EXCEPTION即返回的

asyncio.create_task vs loop.create_task vs asyncio.ensure_future

創(chuàng)建一個Task一共有3種方法,如這小節(jié)的標(biāo)題。在上篇文章我說過,從Python 3.7開始可以統(tǒng)一的使用更高階的asyncio.create_task。其實asyncio.create_task就是用的loop.create_task:

def create_task(coro):
    loop = events.get_running_loop()
    return loop.create_task(coro)

loop.create_task接受的參數(shù)需要是一個協(xié)程,但是asyncio.ensure_future除了接受協(xié)程,還可以是Future對象或者awaitable對象:

如果參數(shù)是協(xié)程,其實底層還是用的loop.create_task,返回Task對象

如果是Future對象會直接返回

如果是一個awaitable對象會await這個對象的__await__方法,再執(zhí)行一次ensure_future,最后返回Task或者Future

所以就像ensure_future名字說的,確保這個是一個Future對象:Task是Future 子類,前面說過一般情況下開發(fā)者不需要自己創(chuàng)建Future

其實前面說的asyncio.wait和asyncio.gather里面都用了asyncio.ensure_future。對于絕大多數(shù)場景要并發(fā)執(zhí)行的是協(xié)程,所以直接用asyncio.create_task就足夠了~

下一節(jié):深究Python中的asyncio庫-shield函數(shù)


本文標(biāo)題:創(chuàng)新互聯(lián)Python教程:深究Python中的asyncio庫-線程并發(fā)函數(shù)
標(biāo)題URL:http://m.5511xx.com/article/coheisc.html