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

python爬蟲進(jìn)階之協(xié)程詳解

 更新時間:2023年08月09日 10:58:54   作者:南岸青梔*  
這篇文章主要介紹了python爬蟲進(jìn)階之協(xié)程詳解,coroutine中文翻譯叫協(xié)程,在 Python 中昌指代為協(xié)程對象類型,可以將協(xié)程對象注冊到時間循環(huán)中被調(diào)用,需要的朋友可以參考下

python爬蟲–協(xié)程

基本知識

  • event_loop:事件循環(huán),相當(dāng)于一個無限循環(huán),我們可以把一些函數(shù)注冊到這個事件循環(huán)上,當(dāng)滿足某些條件的時候,函數(shù)就會被循環(huán)執(zhí)行。
  • coroutine:攜程對象,我們可以將攜程對象注冊到事件循環(huán)中,它會被時間循環(huán)調(diào)用。我們可以使用async關(guān)鍵字來定義一個方法,這個方法在調(diào)用時不會被立即執(zhí)行,而是返回一個協(xié)程對象。
  • task:任務(wù),它是對協(xié)程對象的進(jìn)一步封裝, 包含了任務(wù)的各個狀態(tài)。
  • future:代表將來執(zhí)行或還沒有執(zhí)行的任務(wù),實際上和task 沒有本質(zhì)區(qū)別。
  • async定義-個協(xié)程.
  • await用來掛起阻塞方法的執(zhí)行。

協(xié)程的基本使用

import asyncio
async def request(url):
    print('正在請求的url是:',url)
    print('請求成功:',url)
#async修飾的函數(shù),調(diào)用之后返回的一個協(xié)程對象
c = request('www.baidu.com')
# #創(chuàng)建一個事件循環(huán)對象
# loop = asyncio.get_event_loop()
#
# #將攜程對象注冊到loop中,然后啟動loop
# loop.run_until_complete(c)
# #task的使用
# loop = asyncio.get_event_loop()
# #基于loop創(chuàng)建一個task對象
# task = loop.create_task(c)
# print(task)
# loop.run_until_complete(task)
# print(task)
#future的使用
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(c)
print(task)
loop.run_until_complete(task)
print(task)

多任務(wù)協(xié)程實現(xiàn)

import asyncio
import time
async def request(url):
    print('正在請求的url是:',url)
    #在異步協(xié)程中如果出現(xiàn)同步模塊相關(guān)的代碼,那么就無法實現(xiàn)異步
    #time.sleep(2)
    await asyncio.sleep(2)
    print('請求成功:',url)
#async修飾的函數(shù),調(diào)用之后返回的一個協(xié)程對象
start = time.time()
urls = {
    'www.123.com',
    'www.234.com',
    'www.345.com'
}
#存放多個任務(wù)對象
stask = []
for url in urls:
    c = request(url)
    task = asyncio.ensure_future(c)
    stask.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(stask))
print(time.time()-start)

多任務(wù)協(xié)程異步實現(xiàn)

在進(jìn)行多任務(wù)協(xié)程實現(xiàn)前,還需要建立一個簡單的本地http服務(wù)

from flask import Flask
import time
app = Flask(__name__)
@app.route('/azb')
def index_azb():
    time.sleep(2)
    return 'Hello azb'
@app.route('/xx')
def index_xx():
    time.sleep(2)
    return 'Hello xx'
@app.route('/hh')
def index_hh():
    time.sleep(2)
    return 'Hello hh'
if __name__ == '__main__':
    app.run(threaded=True)

在這里插入圖片描述

實現(xiàn)

import requests,asyncio,time
start = time.time()
urls = [
    'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh'
]
async def get_page(url):
    print('正在下載',url)
    #request是基于同步,必須使用基于異步的網(wǎng)絡(luò)請求模塊
    response = requests.get(url=url)
    print('下載成功!',url)
tasks = []
for url in urls:
    c = get_page(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print('總耗時',time.time()-start)

在這里插入圖片描述

aiohttp模塊引入

import requests,asyncio,time,aiohttp
start = time.time()
urls = [
    'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh'
]
async def get_page(url):
    async with aiohttp.ClientSession() as session:
        async with await session.get(url) as response:
            #text()返回字符串形式的響應(yīng)數(shù)據(jù)
            #read()返回的二進(jìn)制形式的響應(yīng)數(shù)據(jù)
            #json()返回的就是json對象
            #獲取響應(yīng)數(shù)據(jù)操作之前一定要使用await進(jìn)行手動掛起
            page_text = await response.text()
            print(page_text)
tasks = []
for url in urls:
    c = get_page(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print('總耗時',time.time()-start)

在這里插入圖片描述

到此這篇關(guān)于python爬蟲進(jìn)階之協(xié)程詳解的文章就介紹到這了,更多相關(guān)python協(xié)程爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python把對應(yīng)格式的csv文件轉(zhuǎn)換成字典類型存儲腳本的方法

    Python把對應(yīng)格式的csv文件轉(zhuǎn)換成字典類型存儲腳本的方法

    今天小編就為大家分享一篇Python把對應(yīng)格式的csv文件轉(zhuǎn)換成字典類型存儲腳本的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Django加載配置的過程詳解

    Django加載配置的過程詳解

    這篇文章主要介紹了Django加載配置的過程詳解,包括Django服務(wù)啟動 manage.py的詳細(xì)介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Numpy判斷數(shù)組是否全0的三種方法

    Numpy判斷數(shù)組是否全0的三種方法

    本文介紹了三種判斷NumPy數(shù)組是否全為零的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • python re.sub()替換正則的匹配內(nèi)容方法

    python re.sub()替換正則的匹配內(nèi)容方法

    今天小編就為大家分享一篇python re.sub()替換正則的匹配內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 使用pyhon繪圖比較兩個手機屏幕大小(實例代碼)

    使用pyhon繪圖比較兩個手機屏幕大小(實例代碼)

    這篇文章主要介紹了使用pyhon繪圖比較兩個手機屏幕大小,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Python中的os.path路徑模塊中的操作方法總結(jié)

    Python中的os.path路徑模塊中的操作方法總結(jié)

    os.path模塊主要集成了針對路徑文件夾的操作功能,這里我們就來看一下Python中的os.path路徑模塊中的操作方法總結(jié),需要的朋友可以參考下
    2016-07-07
  • python?math模塊使用方法介紹

    python?math模塊使用方法介紹

    math庫是python的內(nèi)置數(shù)學(xué)類函數(shù)庫,支持整數(shù)和浮點數(shù)運算,math模塊下的函數(shù),返回值均為浮點數(shù),除非有說明,math模塊提供類似C語言標(biāo)準(zhǔn)定義的數(shù)學(xué)函數(shù)
    2022-08-08
  • python使用for...else跳出雙層嵌套循環(huán)的方法實例

    python使用for...else跳出雙層嵌套循環(huán)的方法實例

    這篇文章主要給大家介紹了關(guān)于python使用for...else跳出雙層嵌套循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 使用Python提取文本中含有特定字符串的方法示例

    使用Python提取文本中含有特定字符串的方法示例

    這篇文章主要給大家介紹了關(guān)于如何使用Python提取文本中含有特定字符串的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python判斷、獲取一張圖片主色調(diào)的2個實例

    python判斷、獲取一張圖片主色調(diào)的2個實例

    一幅圖片,想通過程序判斷獲得其主要色調(diào),應(yīng)該怎么樣處理?本文通過python實現(xiàn)判斷、獲取一張圖片的主色調(diào)方法,需要的朋友可以參考下
    2014-04-04

最新評論