溫馨提示×

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

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

Python如何實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng)

發(fā)布時(shí)間:2021-11-25 14:54:45 來(lái)源:億速云 閱讀:261 作者:小新 欄目:大數(shù)據(jù)

小編給大家分享一下Python如何實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

什么是線(xiàn)程

線(xiàn)程(Thread)也叫輕量級(jí)進(jìn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。線(xiàn)程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線(xiàn)程共享進(jìn)程所擁有的全部資源。一個(gè)線(xiàn)程可以創(chuàng)建和撤消另一個(gè)線(xiàn)程,同一進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行。

為什么要使用多線(xiàn)程

線(xiàn)程在程序中是獨(dú)立的、并發(fā)的執(zhí)行流。與分隔的進(jìn)程相比,進(jìn)程中線(xiàn)程之間的隔離程度要小,它們共享內(nèi)存、文件句柄和其他進(jìn)程應(yīng)有的狀態(tài)。

因?yàn)榫€(xiàn)程的劃分尺度小于進(jìn)程,使得多線(xiàn)程程序的并發(fā)性高。進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

線(xiàn)程比進(jìn)程具有更高的性能,這是由于同一個(gè)進(jìn)程中的線(xiàn)程都有共性多個(gè)線(xiàn)程共享同一個(gè)進(jìn)程的虛擬空間。線(xiàn)程共享的環(huán)境包括進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)等,利用這些共享的數(shù)據(jù),線(xiàn)程之間很容易實(shí)現(xiàn)通信。

操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),必須為該進(jìn)程分配獨(dú)立的內(nèi)存空間,并分配大量的相關(guān)資源,但創(chuàng)建線(xiàn)程則簡(jiǎn)單得多。因此,使用多線(xiàn)程來(lái)實(shí)現(xiàn)并發(fā)比使用多進(jìn)程的性能要高得多。

總結(jié)起來(lái),使用多線(xiàn)程編程具有如下幾個(gè)優(yōu)點(diǎn):

進(jìn)程之間不能共享內(nèi)存,但線(xiàn)程之間共享內(nèi)存非常容易。

操作系統(tǒng)在創(chuàng)建進(jìn)程時(shí),需要為該進(jìn)程重新分配系統(tǒng)資源,但創(chuàng)建線(xiàn)程的代價(jià)則小得多。因此,使用多線(xiàn)程來(lái)實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行比使用多進(jìn)程的效率高。

Python 語(yǔ)言?xún)?nèi)置了多線(xiàn)程功能支持,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式,從而簡(jiǎn)化了 Python 的多線(xiàn)程編程。

多線(xiàn)程的優(yōu)點(diǎn)

多線(xiàn)程類(lèi)似于同時(shí)執(zhí)行多個(gè)不同程序,多線(xiàn)程運(yùn)行有如下優(yōu)點(diǎn):

使用線(xiàn)程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。

用戶(hù)界面可以更加吸引人,比如用戶(hù)點(diǎn)擊了一個(gè)按鈕去觸發(fā)某些事件的處理,可以彈出一個(gè)進(jìn)度條來(lái)顯示處理的進(jìn)度。

程序的運(yùn)行速度可能加快。

在一些等待的任務(wù)實(shí)現(xiàn)上如用戶(hù)輸入、文件讀寫(xiě)和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線(xiàn)程就比較有用了。在這種情況下我們可以釋放一些珍貴的資源如內(nèi)存占用等等。

每個(gè)獨(dú)立的線(xiàn)程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線(xiàn)程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制。

每個(gè)線(xiàn)程都有他自己的一組CPU寄存器,稱(chēng)為線(xiàn)程的上下文,該上下文反映了線(xiàn)程上次運(yùn)行該線(xiàn)程的CPU寄存器的狀態(tài)。

指令指針和堆棧指針寄存器是線(xiàn)程上下文中兩個(gè)最重要的寄存器,線(xiàn)程總是在進(jìn)程得到上下文中運(yùn)行的,這些地址都用于標(biāo)志擁有線(xiàn)程的進(jìn)程地址空間中的內(nèi)存。

線(xiàn)程可以被搶占(中斷)。

在其他線(xiàn)程正在運(yùn)行時(shí),線(xiàn)程可以暫時(shí)擱置(也稱(chēng)為睡眠) -- 這就是線(xiàn)程的退讓。

線(xiàn)程可以分為:

內(nèi)核線(xiàn)程:由操作系統(tǒng)內(nèi)核創(chuàng)建和撤銷(xiāo)。

用戶(hù)線(xiàn)程:不需要內(nèi)核支持而在用戶(hù)程序中實(shí)現(xiàn)的線(xiàn)程。

簡(jiǎn)單實(shí)例:

 
import time
import threading   #導(dǎo)入多線(xiàn)程庫(kù)
def sing():     #創(chuàng)建一個(gè)唱歌方法
    for i in range(1,5):
        print("正在唱歌")
        time.sleep(1)


def dance():        #創(chuàng)建一個(gè)跳舞方法    for i in range(1,5):
        print("正在跳舞")
        time.sleep(1)


def run():
    t1 = threading.Thread(target=sing)   #創(chuàng)建線(xiàn)程1
    t2 = threading.Thread(target=dance)   #創(chuàng)建線(xiàn)程2
    t1.start()                           #運(yùn)行線(xiàn)程1
    t2.start()                           #運(yùn)行線(xiàn)程2

run()運(yùn)行截圖

Python如何實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng)

以上是“Python如何實(shí)現(xiàn)多線(xiàn)程爬蟲(chóng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向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