python網(wǎng)絡(luò)爬蟲之協(xié)程的實(shí)現(xiàn)方法
1.協(xié)程
協(xié)程(Coroutine):又稱微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。
簡而言之,就是通過一個線程實(shí)現(xiàn)代碼塊相互切換執(zhí)行。
意義:在一個線程中如果遇到IO等待時間,線程不會傻傻等,會在空閑的時間再干其他事情。
一個線程,可以認(rèn)為是人為的控制線程在函數(shù)之間進(jìn)行線程切換,且僅有一個線程來完成切換。
實(shí)現(xiàn)協(xié)程的方法:
- greenlet 早期模塊
- yield關(guān)鍵字 yield是python中的生成器
- asyncio裝飾器(py3.4)
- async、await關(guān)鍵字(py3.5)【推薦】
1.1greenlet實(shí)現(xiàn)協(xié)程
安裝:
pip install greenlet
# 1. greenlet實(shí)現(xiàn)協(xié)程
from greenlet import greenlet
def func1():
print(1) #第二步:輸出1
gr2.swith() #第三步:切換到func2函數(shù)
print(2) #第六步:輸出2
def func2():
print(3) #第四步:輸出3
gr1.switch() #第五步:切換到func1函數(shù)
print(4) #第七步:輸出4
gr1 = greenlet(func1())
gr2 = greenlet(func2())
gr1.switch() #第一步:執(zhí)行func1函數(shù)1.2 yield關(guān)鍵字實(shí)現(xiàn)協(xié)程
# 2. yield關(guān)鍵字 實(shí)現(xiàn)協(xié)程
def func1(): #如果一個函數(shù)中,存在yield關(guān)鍵字,則認(rèn)為是一個生成器,則執(zhí)行該函數(shù),就生成一個生成器
yield 1 #第二步:輸出1
yield from func2() #第三步:表示跳到func2函數(shù)中
yield 2 #第六步:輸出2
def func2():
yield 3 #第四步:輸出3
yield 4 #第五步:輸出4
f1 = func1()
for item in f1:
print(item) #第一步:執(zhí)行func1函數(shù)1.3 asyncio 實(shí)現(xiàn)協(xié)程
# 3. asyncio 實(shí)現(xiàn)協(xié)程【無需安裝,但要求python需3.4及以上版本】
# 注意:遇到IO阻塞自動切換
import asyncio
@asyncio.coroutine
def func1(): #func1位普通函數(shù),添加了asynic.coroutine裝飾器后,則認(rèn)為該函數(shù)為協(xié)程函數(shù)
print(1)
yield from asyncio.sleep(2) # 遇到IO耗時操作,自動切換到tasks中的其他任務(wù)
print(2)
@asyncio.coroutine
def func2():
print(3)
yield from asyncio.sleep(2) # 遇到IO耗時操作,自動切換到tasks中的其他任務(wù)
print(4)
#協(xié)程函數(shù)的執(zhí)行, 則無法使用func1()方法進(jìn)行執(zhí)行,需要以下的方法進(jìn)行執(zhí)行
# loop = asyncio.get_event_loop()
# loop.run_until_complete(函數(shù)名稱) #使用以上代碼,執(zhí)行函數(shù)的協(xié)程操作 如:loop.run_until_complete(func())
#對func1和func2函數(shù)進(jìn)行封裝, 然后使用下面的4句代碼,在pyhton內(nèi)部,同時會執(zhí)行這兩個協(xié)程函數(shù),線程會隨機(jī)執(zhí)行所有函數(shù)中的一個
tasks = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
# 線程函數(shù)會隨機(jī)執(zhí)行func1和func2協(xié)程函數(shù)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))假設(shè)首先執(zhí)行func1函數(shù),則在遇到 yield from asyncio.sleep(2),線程會跳轉(zhuǎn)到其他協(xié)程函數(shù)中,但因為該python文件中僅有2個協(xié)程函數(shù),
#因此,跳轉(zhuǎn)執(zhí)行func2函數(shù),而在func2函數(shù)中遇到y(tǒng)ield from asyncio.sleep(2),就又會跳轉(zhuǎn)到func1函數(shù)沖,輸出2,最后再到func2函數(shù)中,輸出4.結(jié)束本次操作
#本代碼輸出結(jié)果為: 1 3 2 4
1.4 asyn &await 實(shí)現(xiàn)協(xié)程
# 4. async & await關(guān)鍵字【推薦】 在python3.5及以上
import asyncio
async def func1(): #func1位普通函數(shù),添加了asynic.coroutine裝飾器后,則認(rèn)為該函數(shù)為協(xié)程函數(shù)
print(1)
await asyncio.sleep(2) # 遇到IO耗時操作,自動切換到tasks中的其他任務(wù)
print(2)
@asyncio.coroutine
async def func2():
print(3)
await asyncio.sleep(2) # 遇到IO耗時操作,自動切換到tasks中的其他任務(wù)
print(4)
#對func1和func2函數(shù)進(jìn)行封裝, 然后使用下面的4句代碼,在pyhton內(nèi)部,同時會執(zhí)行這兩個協(xié)程函數(shù),線程會隨機(jī)執(zhí)行所有函數(shù)中的一個
tasks = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
# 線程函數(shù)會隨機(jī)執(zhí)行func1和func2協(xié)程函數(shù)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))#說明:asyncio和 async & await區(qū)別不大,只是將@asyncio.coroutine替換為 asyn ;將yield from 替成 await,其他的都沒變
到此這篇關(guān)于python網(wǎng)絡(luò)爬蟲之協(xié)程的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)python網(wǎng)絡(luò)爬蟲之協(xié)程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的random.choices函數(shù)用法詳解
這篇文章主要給大家介紹了關(guān)于Python中random.choices函數(shù)用法的相關(guān)資料,random.random()?的功能是隨機(jī)返回一個?0-1范圍內(nèi)的浮點(diǎn)數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作
這篇文章主要介紹了Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python實(shí)現(xiàn)隨機(jī)漫步的詳細(xì)過程
隨機(jī)漫步顧名思義每一步都是隨機(jī)的,假設(shè)有一個點(diǎn),下一步往哪里走,走多遠(yuǎn),這些都沒有明確的表示,完全是隨機(jī)的,最后走到哪里,是由一系列隨機(jī)決策決定的,這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)隨機(jī)漫步的相關(guān)資料,需要的朋友可以參考下2023-03-03
Python?pandas中apply函數(shù)簡介以及用法詳解
apply()函數(shù)是pandas里面所有函數(shù)中自由度最高的函數(shù), apply()函數(shù)的參數(shù)是一個函數(shù)指針,這里可以使用lambda表達(dá)式幫助簡化代碼,下面這篇文章主要給大家介紹了關(guān)于Python?pandas中apply函數(shù)簡介以及用法的相關(guān)資料,需要的朋友可以參考下2022-09-09
python實(shí)現(xiàn)微信跳一跳輔助工具步驟詳解
這篇文章主要介紹了python實(shí)現(xiàn)微信跳一跳輔助工具的步驟詳解以及使用說明,需要的朋友可以參考下2018-01-01
Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼
這篇文章主要介紹了Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
python使用pandas讀xlsx文件的實(shí)現(xiàn)
這篇文章主要介紹了python使用pandas讀xlsx文件的實(shí)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
Python學(xué)習(xí)之名字,作用域,名字空間(下)
這篇文章主要介紹了Python學(xué)習(xí)之名字,作用域,名字空間,緊接上一篇文章內(nèi)容展開全文,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助2022-05-05

