python3爬蟲中異步協(xié)程是什么-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、遷西網(wǎng)絡(luò)推廣、小程序開發(fā)、遷西網(wǎng)絡(luò)營銷、遷西企業(yè)策劃、遷西品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供遷西建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

這篇文章主要介紹python3爬蟲中異步協(xié)程是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

1. 前言

在執(zhí)行一些 IO 密集型任務(wù)的時(shí)候,程序常常會因?yàn)榈却?IO 而阻塞。比如在網(wǎng)絡(luò)爬蟲中,如果我們使用 requests 庫來進(jìn)行請求的話,如果網(wǎng)站響應(yīng)速度過慢,程序一直在等待網(wǎng)站響應(yīng),最后導(dǎo)致其爬取效率是非常非常低的。

為了解決這類問題,本文就來探討一下 Python 中異步協(xié)程來加速的方法,此種方法對于 IO 密集型任務(wù)非常有效。如將其應(yīng)用到網(wǎng)絡(luò)爬蟲中,爬取效率甚至可以成百倍地提升。

注:本文協(xié)程使用 async/await 來實(shí)現(xiàn),需要 Python 3.5 及以上版本。

2. 基本了解

在了解異步協(xié)程之前,我們首先得了解一些基礎(chǔ)概念,如阻塞和非阻塞、同步和異步、多進(jìn)程和協(xié)程。

2.1 阻塞

阻塞狀態(tài)指程序未得到所需計(jì)算資源時(shí)被掛起的狀態(tài)。程序在等待某個(gè)操作完成期間,自身無法繼續(xù)干別的事情,則稱該程序在該操作上是阻塞的。

常見的阻塞形式有:網(wǎng)絡(luò) I/O 阻塞、磁盤 I/O 阻塞、用戶輸入阻塞等。阻塞是無處不在的,包括 CPU 切換上下文時(shí),所有的進(jìn)程都無法真正干事情,它們也會被阻塞。如果是多核 CPU 則正在執(zhí)行上下文切換操作的核不可被利用。

2.2 非阻塞

程序在等待某操作過程中,自身不被阻塞,可以繼續(xù)運(yùn)行干別的事情,則稱該程序在該操作上是非阻塞的。

非阻塞并不是在任何程序級別、任何情況下都可以存在的。

僅當(dāng)程序封裝的級別可以囊括獨(dú)立的子程序單元時(shí),它才可能存在非阻塞狀態(tài)。

非阻塞的存在是因?yàn)樽枞嬖?,正因?yàn)槟硞€(gè)操作阻塞導(dǎo)致的耗時(shí)與效率低下,我們才要把它變成非阻塞的。

2.3 同步

不同程序單元為了完成某個(gè)任務(wù),在執(zhí)行過程中需靠某種通信方式以協(xié)調(diào)一致,稱這些程序單元是同步執(zhí)行的。

例如購物系統(tǒng)中更新商品庫存,需要用“行鎖”作為通信信號,讓不同的更新請求強(qiáng)制排隊(duì)順序執(zhí)行,那更新庫存的操作是同步的。

簡言之,同步意味著有序。

2.4 異步

為完成某個(gè)任務(wù),不同程序單元之間過程中無需通信協(xié)調(diào),也能完成任務(wù)的方式,不相關(guān)的程序單元之間可以是異步的。

例如,爬蟲下載網(wǎng)頁。調(diào)度程序調(diào)用下載程序后,即可調(diào)度其他任務(wù),而無需與該下載任務(wù)保持通信以協(xié)調(diào)行為。不同網(wǎng)頁的下載、保存等操作都是無關(guān)的,也無需相互通知協(xié)調(diào)。這些異步操作的完成時(shí)刻并不確定。

簡言之,異步意味著無序。

2.5 多進(jìn)程

多進(jìn)程就是利用 CPU 的多核優(yōu)勢,在同一時(shí)間并行地執(zhí)行多個(gè)任務(wù),可以大大提高執(zhí)行效率。

2.6 協(xié)程

協(xié)程,英文叫做 Coroutine,又稱微線程,纖程,協(xié)程是一種用戶態(tài)的輕量級線程。

協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度切換時(shí),將寄存器上下文和棧保存到其他地方,在切回來的時(shí)候,恢復(fù)先前保存的寄存器上下文和棧。因此協(xié)程能保留上一次調(diào)用時(shí)的狀態(tài),即所有局部狀態(tài)的一個(gè)特定組合,每次過程重入時(shí),就相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài)。

協(xié)程本質(zhì)上是個(gè)單進(jìn)程,協(xié)程相對于多進(jìn)程來說,無需線程上下文切換的開銷,無需原子操作鎖定及同步的開銷,編程模型也非常簡單。

我們可以使用協(xié)程來實(shí)現(xiàn)異步操作,比如在網(wǎng)絡(luò)爬蟲場景下,我們發(fā)出一個(gè)請求之后,需要等待一定的時(shí)間才能得到響應(yīng),但其實(shí)在這個(gè)等待過程中,程序可以干許多其他的事情,等到響應(yīng)得到之后才切換回來繼續(xù)處理,這樣可以充分利用 CPU 和其他資源,這就是異步協(xié)程的優(yōu)勢。

3. 異步協(xié)程用法

接下來讓我們來了解下協(xié)程的實(shí)現(xiàn),從 Python 3.4 開始,Python 中加入了協(xié)程的概念,但這個(gè)版本的協(xié)程還是以生成器對象為基礎(chǔ)的,在 Python 3.5 則增加了 async/await,使得協(xié)程的實(shí)現(xiàn)更加方便。

Python 中使用協(xié)程最常用的庫莫過于 asyncio,所以本文會以 asyncio 為基礎(chǔ)來介紹協(xié)程的使用。

首先我們需要了解下面幾個(gè)概念:

event_loop:事件循環(huán),相當(dāng)于一個(gè)無限循環(huán),我們可以把一些函數(shù)注冊到這個(gè)事件循環(huán)上,當(dāng)滿足條件發(fā)生的時(shí)候,就會調(diào)用對應(yīng)的處理方法。

coroutine:中文翻譯叫協(xié)程,在 Python 中常指代為協(xié)程對象類型,我們可以將協(xié)程對象注冊到時(shí)間循環(huán)中,它會被事件循環(huán)調(diào)用。我們可以使用 async 關(guān)鍵字來定義一個(gè)方法,這個(gè)方法在調(diào)用時(shí)不會立即被執(zhí)行,而是返回一個(gè)協(xié)程對象。

task:任務(wù),它是對協(xié)程對象的進(jìn)一步封裝,包含了任務(wù)的各個(gè)狀態(tài)。

future:代表將來執(zhí)行或沒有執(zhí)行的任務(wù)的結(jié)果,實(shí)際上和 task 沒有本質(zhì)區(qū)別。

另外我們還需要了解 async/await 關(guān)鍵字,它是從 Python 3.5 才出現(xiàn)的,專門用于定義協(xié)程。其中,async 定義一個(gè)協(xié)程,await 用來掛起阻塞方法的執(zhí)行。

3.1 定義協(xié)程

首先我們來定義一個(gè)協(xié)程,體驗(yàn)一下它和普通進(jìn)程在實(shí)現(xiàn)上的不同之處,代碼如下:

import asyncio
async def execute(x):
    print('Number:', x)
coroutine = execute(1)
print('Coroutine:', coroutine)
print('After calling execute')
loop = asyncio.get_event_loop()
loop.run_until_complete(coroutine)
print('After calling loop')

當(dāng)前標(biāo)題:python3爬蟲中異步協(xié)程是什么-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article14/dejgde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司App開發(fā)、網(wǎng)站設(shè)計(jì)面包屑導(dǎo)航、服務(wù)器托管、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)