協(xié)程
協(xié)程播揪,又稱微線程植旧,纖程。英文名Coroutine亡容。
協(xié)程是啥
協(xié)程是python個(gè)中另外一種實(shí)現(xiàn)多任務(wù)的方式品洛,只不過(guò)比線程更小占用更小執(zhí)行單元(理解為需要的資源)树姨。 為啥說(shuō)它是一個(gè)執(zhí)行單元,因?yàn)樗詭PU上下文桥状。這樣只要在合適的時(shí)機(jī)帽揪, 我們可以把一個(gè)協(xié)程 切換到另一個(gè)協(xié)程。 只要這個(gè)過(guò)程中保存或恢復(fù) CPU上下文那么程序還是可以運(yùn)行的岛宦。
通俗的理解:在一個(gè)線程中的某個(gè)函數(shù)台丛,可以在任何地方保存當(dāng)前函數(shù)的一些臨時(shí)變量等信息耍缴,然后切換到另外一個(gè)函數(shù)中執(zhí)行砾肺,注意不是通過(guò)調(diào)用函數(shù)的方式做到的,并且切換的次數(shù)以及什么時(shí)候再切換到原來(lái)的函數(shù)都由開發(fā)者自己確定
協(xié)程和線程差異
在實(shí)現(xiàn)多任務(wù)時(shí), 線程切換從系統(tǒng)層面遠(yuǎn)不止保存和恢復(fù) CPU上下文這么簡(jiǎn)單防嗡。 操作系統(tǒng)為了程序運(yùn)行的高效性每個(gè)線程都有自己緩存Cache等等數(shù)據(jù)变汪,操作系統(tǒng)還會(huì)幫你做這些數(shù)據(jù)的恢復(fù)操作。 所以線程的切換非常耗性能蚁趁。但是協(xié)程的切換只是單純的操作CPU的上下文裙盾,所以一秒鐘切換個(gè)上百萬(wàn)次系統(tǒng)都抗的住。
簡(jiǎn)單實(shí)現(xiàn)協(xié)程
importtimedefwork1():whileTrue:? ? ? ? print("----work1---")yieldtime.sleep(0.5)defwork2():whileTrue:? ? ? ? print("----work2---")yieldtime.sleep(0.5)defmain():w1 = work1()? ? w2 = work2()whileTrue:? ? ? ? next(w1)? ? ? ? next(w2)if__name__ =="__main__":? ? main()
運(yùn)行結(jié)果:
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
----work1---
----work2---
...省略...