python網(wǎng)絡(luò)爬蟲之協(xié)程的實現(xiàn)方法
1.協(xié)程
協(xié)程(Coroutine):又稱微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。
簡而言之,就是通過一個線程實現(xiàn)代碼塊相互切換執(zhí)行。
意義:在一個線程中如果遇到IO等待時間,線程不會傻傻等,會在空閑的時間再干其他事情。
一個線程,可以認為是人為的控制線程在函數(shù)之間進行線程切換,且僅有一個線程來完成切換。
實現(xiàn)協(xié)程的方法:
- greenlet 早期模塊
- yield關(guān)鍵字 yield是python中的生成器
- asyncio裝飾器(py3.4)
- async、await關(guān)鍵字(py3.5)【推薦】
1.1greenlet實現(xiàn)協(xié)程
安裝:
pip install greenlet
# 1. greenlet實現(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)鍵字實現(xiàn)協(xié)程
# 2. yield關(guān)鍵字 實現(xiàn)協(xié)程 def func1(): #如果一個函數(shù)中,存在yield關(guā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 實現(xiàn)協(xié)程
# 3. asyncio 實現(xiàn)協(xié)程【無需安裝,但要求python需3.4及以上版本】 # 注意:遇到IO阻塞自動切換 import asyncio @asyncio.coroutine def func1(): #func1位普通函數(shù),添加了asynic.coroutine裝飾器后,則認為該函數(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()方法進行執(zhí)行,需要以下的方法進行執(zhí)行 # loop = asyncio.get_event_loop() # loop.run_until_complete(函數(shù)名稱) #使用以上代碼,執(zhí)行函數(shù)的協(xié)程操作 如:loop.run_until_complete(func()) #對func1和func2函數(shù)進行封裝, 然后使用下面的4句代碼,在pyhton內(nèi)部,同時會執(zhí)行這兩個協(xié)程函數(shù),線程會隨機執(zhí)行所有函數(shù)中的一個 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] # 線程函數(shù)會隨機執(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 實現(xiàn)協(xié)程
# 4. async & await關(guān)鍵字【推薦】 在python3.5及以上 import asyncio async def func1(): #func1位普通函數(shù),添加了asynic.coroutine裝飾器后,則認為該函數(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ù)進行封裝, 然后使用下面的4句代碼,在pyhton內(nèi)部,同時會執(zhí)行這兩個協(xié)程函數(shù),線程會隨機執(zhí)行所有函數(shù)中的一個 tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] # 線程函數(shù)會隨機執(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é)程的實現(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()?的功能是隨機返回一個?0-1范圍內(nèi)的浮點數(shù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-08-08Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作
這篇文章主要介紹了Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python?pandas中apply函數(shù)簡介以及用法詳解
apply()函數(shù)是pandas里面所有函數(shù)中自由度最高的函數(shù), apply()函數(shù)的參數(shù)是一個函數(shù)指針,這里可以使用lambda表達式幫助簡化代碼,下面這篇文章主要給大家介紹了關(guān)于Python?pandas中apply函數(shù)簡介以及用法的相關(guān)資料,需要的朋友可以參考下2022-09-09Python函數(shù)調(diào)用追蹤實現(xiàn)代碼
這篇文章主要介紹了Python函數(shù)調(diào)用追蹤實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11python使用pandas讀xlsx文件的實現(xiàn)
這篇文章主要介紹了python使用pandas讀xlsx文件的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05Python學(xué)習(xí)之名字,作用域,名字空間(下)
這篇文章主要介紹了Python學(xué)習(xí)之名字,作用域,名字空間,緊接上一篇文章內(nèi)容展開全文,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助2022-05-05