協程巢狀協程

2022-09-11 08:48:10 字數 2147 閱讀 9456

import

asyncio

import

functools

#第三層協程

async def

test1():

print('

我是test1')

await asyncio.sleep(1)

print('

test1已經睡了1秒')

await asyncio.sleep(3)

print('

test1又睡了3秒')

return

'xiong'#

第三層協程

async def

test2():

print('

我是test2')

await asyncio.sleep(2)

print('

test2已經睡了2秒')

await asyncio.sleep(2)

print('

test2又睡了2秒')

return

'fan'#

第三層協程

async def

test3():

print('

我是test3')

await asyncio.sleep(3)

print('

test3已經睡了3秒')

await asyncio.sleep(1)

print('

test3又睡了1秒')

return

'yong'#

第三層協程

async def

test4():

print('

我是test4')

await asyncio.sleep(4)

print('

test4已經睡了4秒')

await asyncio.sleep(1)

print('

test4又睡了1秒')

return

'fan'#

協程**函式

defcallback_test1(name, future):

print(future.result()[0]+name)

#第二層協程

async def

main():

tasks =[

asyncio.ensure_future(test1()),

asyncio.ensure_future(test2()),

asyncio.ensure_future(test3()),

]res = await asyncio.gather(*tasks)

return

res#

第二層協程

async def

main1():

res =await test4()

return

res#

最外層協程(主入口)

async def

z_main():

tasks =[

asyncio.ensure_future(main()),

asyncio.ensure_future(main1())

]#用了偏函式傳其他引數

tasks[0].add_done_callback(functools.partial(callback_test1, '

fanyong'))

res1 = await asyncio.gather(*tasks)

return

res1

if__name__ == '

__main__':

#tasks = [

#asyncio.ensure_future(test1()),

#asyncio.ensure_future(test2()),

#asyncio.ensure_future(test3()),#]

#tasks[0].add_done_callback(functools.partial(callback_test1, 'fanyong'))

loop =asyncio.get_event_loop()

res2 =loop.run_until_complete(z_main())

print(res2)

9 協程 協程理論

本節的主題是基於單執行緒來實現併發,即只用乙個主線程 很明顯可利用的cpu只有乙個 情況下實現併發,為此我們需要先回顧下併發的本質 切換 儲存狀態 ps 在介紹程序理論時,提及程序的三種執行狀態,而執行緒才是執行單位,所以也可以將上圖理解為執行緒的三種狀態cpu正在執行乙個任務,會在兩種情況下切走去...

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...