您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Python中的協(xié)程是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
線程和進程的操作是由程序觸發(fā)系統(tǒng)接口,最后的執(zhí)行者是系統(tǒng);協(xié)程的操作則是程序員。
協(xié)程存在的意義:對于多線程應用,CPU通過切片的方式來切換線程間的執(zhí)行,線程切換時需要耗時(保存狀態(tài),下次繼續(xù))。協(xié)程,則只使用一個線程,在一個線程中規(guī)定某個代碼塊執(zhí)行順序。
協(xié)程的適用場景:當程序中存在大量不需要CPU的操作時(IO),適用于協(xié)程;
event loop是協(xié)程執(zhí)行的控制點, 如果你希望執(zhí)行協(xié)程, 就需要用到它們。
event loop提供了如下的特性:
注冊、執(zhí)行、取消延時調(diào)用(異步函數(shù))
創(chuàng)建用于通信的client和server協(xié)議(工具)
創(chuàng)建和別的程序通信的子進程和協(xié)議(工具)
把函數(shù)調(diào)用送入線程池中
協(xié)程示例:
import asyncio async def cor1(): print("COR1 start") await cor2() print("COR1 end") async def cor2(): print("COR2") loop = asyncio.get_event_loop() loop.run_until_complete(cor1()) loop.close()
最后三行是重點。
asyncio.get_event_loop() : asyncio啟動默認的event loop
run_until_complete() : 這個函數(shù)是阻塞執(zhí)行的,知道所有的異步函數(shù)執(zhí)行完成,
close() : 關閉event loop。
1、greenlet
import greenlet def fun1(): print("12") gr2.switch() print("56") gr2.switch() def fun2(): print("34") gr1.switch() print("78") gr1 = greenlet.greenlet(fun1) gr2 = greenlet.greenlet(fun2) gr1.switch()
2、gevent
gevent屬于第三方模塊需要下載安裝包
pip3 install --upgrade pip3 pip3 install gevent
import gevent def fun1(): print("www.baidu.com") # 第一步 gevent.sleep(0) print("end the baidu.com") # 第三步 def fun2(): print("www.zhihu.com") # 第二步 gevent.sleep(0) print("end th zhihu.com") # 第四步 gevent.joinall([ gevent.spawn(fun1), gevent.spawn(fun2), ])
遇到IO操作自動切換:
import gevent import requests def func(url): print("get: %s"%url) gevent.sleep(0) date =requests.get(url) ret = date.text print(url,len(ret)) gevent.joinall([ gevent.spawn(func, 'https://www.pythontab.com/'), gevent.spawn(func, 'https://www.yahoo.com/'), gevent.spawn(func, 'https://github.com/'), ])
以上就是Python中的協(xié)程是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。