python——asyncio模塊實現(xiàn)協(xié)程协饲、異步編程(二)

【六】協(xié)程并發(fā)

定義tasks時可以設(shè)置多個ensure畏腕,也可以像多線程那樣用append方法實現(xiàn)

tasks = [
    asyncio.ensure_future(coroutine1),
    asyncio.ensure_future(coroutine2),
    asyncio.ensure_future(coroutine3)
]

for i in range(4, 6):  
    tasks.append(asyncio.ensure_future(do_some_work(i)))

當(dāng)遇到阻塞時可以使用await讓其他協(xié)程繼續(xù)工作

例如:

import asyncio
import time
now = lambda: time.time()
 
async def do_some_work(x):
    print('Waiting: ', x)
 
    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)
 
coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(3) 

tasks = [
    asyncio.ensure_future(coroutine1),
    asyncio.ensure_future(coroutine2),
    asyncio.ensure_future(coroutine3)
]

for i in range(4, 6):  
    tasks.append(asyncio.ensure_future(do_some_work(i)))
 
loop = asyncio.get_event_loop()

start = now()
loop.run_until_complete(asyncio.wait(tasks))
 
for task in tasks:
    print('Task ret: ', task.result())
 
print('TIME: ', now() - start)

通過運(yùn)行時間可以看出aysncio實現(xiàn)了并發(fā)。asyncio.wait(tasks) 也可以使用 asyncio.gather(*tasks) ,前者接受一個task列表茉稠,后者接收一堆task描馅。

【七】協(xié)程嵌套

使用async可以定義協(xié)程,協(xié)程用于耗時的io操作而线,我們也可以封裝更多的io操作過程铭污,這樣就實現(xiàn)了嵌套的協(xié)程,即一個協(xié)程中await了另外一個協(xié)程吞获,如此連接起來况凉。

例如:

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)
 
    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)
 
async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)
 
    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]
 
    dones, pendings = await asyncio.wait(tasks)
 
    for task in dones:
        print('Task ret: ', task.result())
 
start = now()
 
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
 
print('TIME: ', now() - start)

如果使用的是 asyncio.gather創(chuàng)建協(xié)程對象,那么await的返回值就是協(xié)程運(yùn)行的結(jié)果各拷。

    #dones, pendings = await asyncio.wait(tasks)
        #for task in dones:
        #print('Task ret: ', task.result())
    results = await asyncio.gather(*tasks)
    for result in results:
        print('Task ret: ', result)

不在main協(xié)程函數(shù)里處理結(jié)果刁绒,直接返回await的內(nèi)容,那么最外層的run_until_complete將會返回main協(xié)程的結(jié)果烤黍。

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)
 
    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)
 
async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)
 
    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]
 
    return await asyncio.gather(*tasks)
 
start = now()
loop = asyncio.get_event_loop()
results = loop.run_until_complete(main())
for result in results:
    print('Task ret: ', result)
 
print('TIME: ', now() - start)

或者返回使用asyncio.wait方式掛起協(xié)程知市。

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)
 
    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)
 
async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)
 
    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]
 
    return await asyncio.wait(tasks)
 
start = now()
 
loop = asyncio.get_event_loop()
done, pending = loop.run_until_complete(main())
 
for task in done:
    print('Task ret: ', task.result())
 
print('TIME: ', now() - start)

也可以使用asyncio的as_completed方法

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)
 
    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)
 
async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)
 
    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]
    for task in asyncio.as_completed(tasks):
        result = await task
        print('Task ret: {}'.format(result))
 
start = now()
 
loop = asyncio.get_event_loop()
done = loop.run_until_complete(main())
print('TIME: ', now() - start)

由此可見傻盟,協(xié)程的調(diào)用和組合十分的靈活,我們可以發(fā)揮想象盡情的浪

【六】協(xié)程并發(fā)

定義tasks時可以設(shè)置多個ensure嫂丙,也可以像多線程那樣用append方法實現(xiàn)

tasks = [
    asyncio.ensure_future(coroutine1),
    asyncio.ensure_future(coroutine2),
    asyncio.ensure_future(coroutine3)
]

for i in range(4, 6):  
    tasks.append(asyncio.ensure_future(do_some_work(i)))</pre>

當(dāng)遇到阻塞時可以使用await讓其他協(xié)程繼續(xù)工作

例如:

import asyncio
import time
now = lambda: time.time()

async def do_some_work(x):
    print('Waiting: ', x)

    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)

coroutine1 = do_some_work(1)
coroutine2 = do_some_work(2)
coroutine3 = do_some_work(3) 

tasks = [
    asyncio.ensure_future(coroutine1),
    asyncio.ensure_future(coroutine2),
    asyncio.ensure_future(coroutine3)
]

for i in range(4, 6):  
    tasks.append(asyncio.ensure_future(do_some_work(i)))

loop = asyncio.get_event_loop()

start = now()
loop.run_until_complete(asyncio.wait(tasks))

for task in tasks:
    print('Task ret: ', task.result())

print('TIME: ', now() - start)</pre>
image

通過運(yùn)行時間可以看出aysncio實現(xiàn)了并發(fā)娘赴。asyncio.wait(tasks) 也可以使用 asyncio.gather(*tasks) ,前者接受一個task列表,后者接收一堆task跟啤。

【七】協(xié)程嵌套

使用async可以定義協(xié)程诽表,協(xié)程用于耗時的io操作,我們也可以封裝更多的io操作過程隅肥,這樣就實現(xiàn)了嵌套的協(xié)程竿奏,即一個協(xié)程中await了另外一個協(xié)程,如此連接起來腥放。

例如:

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)

    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)

async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)

    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]

    dones, pendings = await asyncio.wait(tasks)

    for task in dones:
        print('Task ret: ', task.result())

start = now()

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

print('TIME: ', now() - start)</pre>
image

如果使用的是 asyncio.gather創(chuàng)建協(xié)程對象泛啸,那么await的返回值就是協(xié)程運(yùn)行的結(jié)果。

#dones, pendings = await asyncio.wait(tasks)
        #for task in dones:
        #print('Task ret: ', task.result())
    results = await asyncio.gather(*tasks)
    for result in results:
        print('Task ret: ', result)</pre>
image

不在main協(xié)程函數(shù)里處理結(jié)果秃症,直接返回await的內(nèi)容候址,那么最外層的run_until_complete將會返回main協(xié)程的結(jié)果。

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)

    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)

async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)

    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]

    return await asyncio.gather(*tasks)

start = now()
loop = asyncio.get_event_loop()
results = loop.run_until_complete(main())
for result in results:
    print('Task ret: ', result)

print('TIME: ', now() - start)</pre>
image

或者返回使用asyncio.wait方式掛起協(xié)程种柑。

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)

    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)

async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)

    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]

    return await asyncio.wait(tasks)

start = now()

loop = asyncio.get_event_loop()
done, pending = loop.run_until_complete(main())

for task in done:
    print('Task ret: ', task.result())

print('TIME: ', now() - start)</pre>
image

也可以使用asyncio的as_completed方法

import asyncio
import time
now = lambda: time.time()
async def do_some_work(x):
    print('Waiting: ', x)

    await asyncio.sleep(x)
    return 'Done after {}s'.format(x)

async def main():
    coroutine1 = do_some_work(1)
    coroutine2 = do_some_work(2)
    coroutine3 = do_some_work(4)

    tasks = [
        asyncio.ensure_future(coroutine1),
        asyncio.ensure_future(coroutine2),
        asyncio.ensure_future(coroutine3)
    ]
    for task in asyncio.as_completed(tasks):
        result = await task
        print('Task ret: {}'.format(result))

start = now()

loop = asyncio.get_event_loop()
done = loop.run_until_complete(main())
print('TIME: ', now() - start)</pre>
image

由此可見岗仑,協(xié)程的調(diào)用和組合十分的靈活,我們可以發(fā)揮想象盡情的浪

image

原文地址:http://m.blog.csdn.net/sm9sun/article/details/75446875

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莹规,一起剝皮案震驚了整個濱河市赔蒲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良漱,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欢际,死亡現(xiàn)場離奇詭異母市,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)损趋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門患久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浑槽,你說我怎么就攤上這事蒋失。” “怎么了桐玻?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵篙挽,是天一觀的道長。 經(jīng)常有香客問我镊靴,道長铣卡,這世上最難降的妖魔是什么链韭? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮煮落,結(jié)果婚禮上敞峭,老公的妹妹穿的比我還像新娘。我一直安慰自己蝉仇,他們只是感情好旋讹,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轿衔,像睡著了一般沉迹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呀枢,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天胚股,我揣著相機(jī)與錄音,去河邊找鬼裙秋。 笑死琅拌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摘刑。 我是一名探鬼主播进宝,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枷恕!你這毒婦竟也來了党晋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤徐块,失蹤者是張志新(化名)和其女友劉穎未玻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胡控,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳剿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昼激。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庇绽。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橙困,靈堂內(nèi)的尸體忽然破棺而出瞧掺,到底是詐尸還是另有隱情,我是刑警寧澤凡傅,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布辟狈,位于F島的核電站,受9級特大地震影響像捶,放射性物質(zhì)發(fā)生泄漏上陕。R本人自食惡果不足惜桩砰,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望释簿。 院中可真熱鬧亚隅,春花似錦、人聲如沸庶溶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偏螺。三九已至行疏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間套像,已是汗流浹背酿联。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留夺巩,地道東北人贞让。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像柳譬,于是被迫代替她去往敵國和親喳张。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容