您好,登錄后才能下訂單哦!
小編給大家分享一下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)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(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)容。