欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python網(wǎng)絡(luò)爬蟲之協(xié)程的實(shí)現(xiàn)方法

 更新時(shí)間:2023年08月09日 11:37:07   作者:小維_  
這篇文章主要介紹了python網(wǎng)絡(luò)爬蟲之協(xié)程的實(shí)現(xiàn)方法,協(xié)程Coroutine又稱微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù),簡(jiǎn)而言之,就是通過(guò)一個(gè)線程實(shí)現(xiàn)代碼塊相互切換執(zhí)行,需要的朋友可以參考下

1.協(xié)程

協(xié)程(Coroutine):又稱微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)。

簡(jiǎn)而言之,就是通過(guò)一個(gè)線程實(shí)現(xiàn)代碼塊相互切換執(zhí)行。

意義:在一個(gè)線程中如果遇到IO等待時(shí)間,線程不會(huì)傻傻等,會(huì)在空閑的時(shí)間再干其他事情。

一個(gè)線程,可以認(rèn)為是人為的控制線程在函數(shù)之間進(jìn)行線程切換,且僅有一個(gè)線程來(lái)完成切換。

實(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():    #如果一個(gè)函數(shù)中,存在yield關(guān)鍵字,則認(rèn)為是一個(gè)生成器,則執(zhí)行該函數(shù),就生成一個(gè)生成器
    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é)程【無(wú)需安裝,但要求python需3.4及以上版本】
# 注意:遇到IO阻塞自動(dòng)切換
import asyncio
@asyncio.coroutine
def func1():    #func1位普通函數(shù),添加了asynic.coroutine裝飾器后,則認(rèn)為該函數(shù)為協(xié)程函數(shù)
    print(1)
    yield  from asyncio.sleep(2)  # 遇到IO耗時(shí)操作,自動(dòng)切換到tasks中的其他任務(wù)
    print(2)
@asyncio.coroutine
def func2():
    print(3)
    yield  from asyncio.sleep(2)    # 遇到IO耗時(shí)操作,自動(dòng)切換到tasks中的其他任務(wù)
    print(4)
#協(xié)程函數(shù)的執(zhí)行, 則無(wú)法使用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())
#對(duì)func1和func2函數(shù)進(jìn)行封裝, 然后使用下面的4句代碼,在pyhton內(nèi)部,同時(shí)會(huì)執(zhí)行這兩個(gè)協(xié)程函數(shù),線程會(huì)隨機(jī)執(zhí)行所有函數(shù)中的一個(gè)
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
# 線程函數(shù)會(huì)隨機(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),線程會(huì)跳轉(zhuǎn)到其他協(xié)程函數(shù)中,但因?yàn)樵損ython文件中僅有2個(gè)協(xié)程函數(shù),

#因此,跳轉(zhuǎn)執(zhí)行func2函數(shù),而在func2函數(shù)中遇到y(tǒng)ield from asyncio.sleep(2),就又會(huì)跳轉(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耗時(shí)操作,自動(dòng)切換到tasks中的其他任務(wù)
        print(2)
@asyncio.coroutine
async def func2():
        print(3)
        await asyncio.sleep(2)    # 遇到IO耗時(shí)操作,自動(dòng)切換到tasks中的其他任務(wù)
        print(4)
#對(duì)func1和func2函數(shù)進(jìn)行封裝, 然后使用下面的4句代碼,在pyhton內(nèi)部,同時(shí)會(huì)執(zhí)行這兩個(gè)協(xié)程函數(shù),線程會(huì)隨機(jī)執(zhí)行所有函數(shù)中的一個(gè)
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
# 線程函數(shù)會(huì)隨機(jī)執(zhí)行func1和func2協(xié)程函數(shù)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

#說(shuō)明:asyncio和 async & await區(qū)別不大,只是將@asyncio.coroutine替換為 asyn ;將yield from 替成 await,其他的都沒(méi)變

到此這篇關(guān)于python網(wǎng)絡(luò)爬蟲之協(xié)程的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)python網(wǎng)絡(luò)爬蟲之協(xié)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中的random.choices函數(shù)用法詳解

    Python中的random.choices函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于Python中random.choices函數(shù)用法的相關(guān)資料,random.random()?的功能是隨機(jī)返回一個(gè)?0-1范圍內(nèi)的浮點(diǎn)數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作

    Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作

    這篇文章主要介紹了Pytorch 使用 nii數(shù)據(jù)做輸入數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python中的進(jìn)制轉(zhuǎn)換詳解

    Python中的進(jìn)制轉(zhuǎn)換詳解

    這篇文章主要介紹了Python中的進(jìn)制轉(zhuǎn)換詳解,python內(nèi)置函數(shù)進(jìn)行進(jìn)制轉(zhuǎn)換的原理是將讀入的一個(gè)字符串(python默認(rèn)讀入的都是字符串形式)轉(zhuǎn)為10進(jìn)制,然后再用相關(guān)函數(shù)進(jìn)行其他進(jìn)制轉(zhuǎn)換,需要的朋友可以參考下
    2023-08-08
  • Python實(shí)現(xiàn)隨機(jī)漫步的詳細(xì)過(guò)程

    Python實(shí)現(xiàn)隨機(jī)漫步的詳細(xì)過(guò)程

    隨機(jī)漫步顧名思義每一步都是隨機(jī)的,假設(shè)有一個(gè)點(diǎn),下一步往哪里走,走多遠(yuǎn),這些都沒(méi)有明確的表示,完全是隨機(jī)的,最后走到哪里,是由一系列隨機(jī)決策決定的,這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)隨機(jī)漫步的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Python?pandas中apply函數(shù)簡(jiǎn)介以及用法詳解

    Python?pandas中apply函數(shù)簡(jiǎn)介以及用法詳解

    apply()函數(shù)是pandas里面所有函數(shù)中自由度最高的函數(shù), apply()函數(shù)的參數(shù)是一個(gè)函數(shù)指針,這里可以使用lambda表達(dá)式幫助簡(jiǎn)化代碼,下面這篇文章主要給大家介紹了關(guān)于Python?pandas中apply函數(shù)簡(jiǎn)介以及用法的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Pandas直接讀取sql腳本的方法

    Pandas直接讀取sql腳本的方法

    這篇文章主要介紹了Pandas直接讀取sql腳本的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • python實(shí)現(xiàn)微信跳一跳輔助工具步驟詳解

    python實(shí)現(xiàn)微信跳一跳輔助工具步驟詳解

    這篇文章主要介紹了python實(shí)現(xiàn)微信跳一跳輔助工具的步驟詳解以及使用說(shuō)明,需要的朋友可以參考下
    2018-01-01
  • Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼

    Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python函數(shù)調(diào)用追蹤實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python使用pandas讀xlsx文件的實(shí)現(xiàn)

    python使用pandas讀xlsx文件的實(shí)現(xiàn)

    這篇文章主要介紹了python使用pandas讀xlsx文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python學(xué)習(xí)之名字,作用域,名字空間(下)

    Python學(xué)習(xí)之名字,作用域,名字空間(下)

    這篇文章主要介紹了Python學(xué)習(xí)之名字,作用域,名字空間,緊接上一篇文章內(nèi)容展開(kāi)全文,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-05-05

最新評(píng)論