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

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

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

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ù)用法詳解

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

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

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

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

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

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

    Python實現(xiàn)隨機漫步的詳細過程

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

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

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

    Pandas直接讀取sql腳本的方法

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

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

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

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

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

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

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

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

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

最新評論