溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么

發(fā)布時(shí)間:2020-08-04 13:57:18 來(lái)源:億速云 閱讀:209 作者:清晨 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

認(rèn)識(shí)生產(chǎn)者和消費(fèi)者模式

生產(chǎn)者和消費(fèi)者是多線程中很常見(jiàn)的一個(gè)問(wèn)題。產(chǎn)生數(shù)據(jù)的模塊,我們稱之為生產(chǎn)者,而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。但是單單只有生產(chǎn)者和消費(fèi)者顯然還是不夠的,一般來(lái)說(shuō),我們還有一個(gè)緩沖區(qū),抽象出來(lái)的流程如下圖所示。

Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么

將這個(gè)過(guò)程以實(shí)際例子來(lái)說(shuō)明:

假如我們是一個(gè)生產(chǎn)辣條的廠家,我們生產(chǎn)出來(lái)的辣條肯定是一箱一箱地放在倉(cāng)庫(kù)里面,然后賣出去給消費(fèi)者?!静辉倏紤]經(jīng)銷商環(huán)節(jié)】

1.我們把一箱一箱的辣條生產(chǎn)好。——>>>相當(dāng)于生產(chǎn)者制造數(shù)據(jù)

2.我們把辣條放到倉(cāng)庫(kù)中?!?gt;>>相當(dāng)于將數(shù)據(jù)放到緩沖區(qū)

3.我們把辣條給取出來(lái)?!?gt;>>相當(dāng)于把數(shù)據(jù)從緩沖區(qū)取出

4.我們把取出的辣條賣給消費(fèi)者吃掉。——>>>相當(dāng)于從緩沖區(qū)出來(lái)的數(shù)據(jù)經(jīng)過(guò)了處理

應(yīng)用于爬蟲(chóng)

Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么

生產(chǎn)者:不斷產(chǎn)生待爬取的url。【比如需要下載圖片,此時(shí)就需要不斷獲取圖片的url】

緩沖區(qū):將獲取到的url進(jìn)行儲(chǔ)存。

消費(fèi)者:對(duì)生產(chǎn)者獲取到的url從緩沖區(qū)拿出來(lái),然后發(fā)起請(qǐng)求?!鞠喈?dāng)于對(duì)下載url】

對(duì)于通用爬蟲(chóng)(單線程)來(lái)說(shuō),我們拿到一個(gè)圖片的url,然后就進(jìn)行下載,效率太低。

對(duì)于異步爬蟲(chóng)(多線程)來(lái)說(shuō),我們可以同時(shí)從緩沖區(qū)取出多個(gè)圖片的url,然后一次多張下載。

Queue隊(duì)列線程安全

當(dāng)采用多線程的生產(chǎn)者和消費(fèi)者模式時(shí),生產(chǎn)者生產(chǎn)出來(lái)的數(shù)據(jù)【對(duì)應(yīng)于爬蟲(chóng)爬取到的圖片url】,將其儲(chǔ)存于緩沖區(qū),【緩沖區(qū)即全局變量】,此時(shí)必然面臨一個(gè)問(wèn)題,就是數(shù)據(jù)不同步【數(shù)據(jù)錯(cuò)亂】等問(wèn)題,后續(xù)再執(zhí)行操作就存在一定問(wèn)題了。

再舉個(gè)例子:

比如有一個(gè)列表為A=[0],此時(shí)去修改里面的值,修改實(shí)際上分為兩步:第一步是選取到那個(gè)元素,第二步才是賦值修改。如果說(shuō)是多線程來(lái)執(zhí)行這個(gè)操作,就有可能會(huì)發(fā)生一些意想不到的錯(cuò)誤。比如第一個(gè)線程要賦值為1,第二個(gè)線程要賦值為2。按照我們正常的理解,最終結(jié)果應(yīng)該是2,但是對(duì)于多線程來(lái)說(shuō),它的結(jié)果也有可能是1。

考慮這一種情況,當(dāng)線程1選定了A[0],此時(shí)切換到了線程2,然后線程2選定了A[0],并且執(zhí)行了下一步賦值的操作,這樣就先將A這個(gè)列表賦值為2了,接著再次切換到了線程1,此時(shí)線程1完成賦值(因?yàn)樵谇懊嬉呀?jīng)選定),此時(shí)最終結(jié)果變?yōu)?。所以多線程總是會(huì)面臨各種數(shù)據(jù)不安全的問(wèn)題。

Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么

解決方案:

1.加鎖機(jī)制(已經(jīng)講過(guò))

2.Queue隊(duì)列線程安全。

什么是Queue隊(duì)列線程安全?

類似列表,但又不是列表。

在Python中提供了同步的、線程安全的隊(duì)列類,這些隊(duì)列都實(shí)現(xiàn)了鎖原語(yǔ),能夠在多線程中直接使用。可以使用隊(duì)列來(lái)實(shí)現(xiàn)線程間的同步,即保證數(shù)據(jù)不會(huì)亂掉。

Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么

關(guān)于Python爬蟲(chóng)中生產(chǎn)者和消費(fèi)者模式是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI