揭秘Python并发编程——协程
原文鏈接:https://baijiahao.baidu.com/s?id=1649450510185145678&wfr=spider&for=pc
Python并發(fā)編程一直是進(jìn)階當(dāng)中不可跨越的一道坎,其中包括進(jìn)程、線程、協(xié)程,今天我們就來(lái)聊一聊協(xié)程。
協(xié)程的定義很簡(jiǎn)單,從頭到尾只有一條任務(wù)線在進(jìn)行,就像是你可以在煮雞蛋的時(shí)候背單詞,但無(wú)論是煮雞蛋還是背單詞,始終都是你一個(gè)人在進(jìn)行任務(wù),線程的概念稍有不同,是把一個(gè)人分成兩個(gè)人,一個(gè)在煮雞蛋,一個(gè)在背單詞,我們直接上代碼看一下:
這是一段普通的代碼,我們分別讓不同的url睡眠不同的時(shí)間,總共是10s,看一下運(yùn)行結(jié)果:
然后,我們使用協(xié)程來(lái)執(zhí)行這段代碼:
我們來(lái)看一下運(yùn)行時(shí)間:
從結(jié)果來(lái)看,運(yùn)行時(shí)間從10s縮短到了4s,基本上是最長(zhǎng)的那個(gè)程序的運(yùn)行時(shí)間。
那么具體的協(xié)程實(shí)現(xiàn)的具體原理是什么呢,我們來(lái)分解一下代碼:
先看一下輸出內(nèi)容:
我們這里使用async來(lái)聲明一個(gè)異步函數(shù),使用await來(lái)執(zhí)行異步函數(shù),await的執(zhí)行效果會(huì)使程序阻塞在這里,最后需要使用asyncio.run()來(lái)觸發(fā)運(yùn)行,asyncio.run()作為主程序的入口函數(shù),在整個(gè)過(guò)程中只執(zhí)行一次
當(dāng)使用Task創(chuàng)建任務(wù)時(shí),所有任務(wù)都會(huì)做好準(zhǔn)備:
首先打印'before await'執(zhí)行await task1,打印'worker_1 start',遇到sleep開(kāi)始切換切換到執(zhí)行await task2,后續(xù)沒(méi)有需要執(zhí)行的任務(wù),所以暫時(shí)停留在Task2當(dāng)task1的sleep完成,任務(wù)切回task1,打印'worker_1 done'之后切回task2等待sleep完成,打印'worker_2 done'以上就是協(xié)程的執(zhí)行順序了。
希望大家這個(gè)例子可以幫助大家更好的運(yùn)用python。
總結(jié)
以上是生活随笔為你收集整理的揭秘Python并发编程——协程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 神经网络算法学习---mini-batc
- 下一篇: 研讨会 | 知识工程与问答技术研讨会 (