python结束进程树_【python爬虫】线程进程
關(guān)注:程序運(yùn)行速度---->主要是由cpu(大腦)來決定。
想要提高程序的運(yùn)行速度----->提高cpu利用率。
提高cpu的利用率由兩種途徑:
1、讓cpu不休息。cpu每時(shí)每刻都在處理任務(wù),這個(gè)任務(wù)可以理解為線程。這種情況就叫做多線程。
2、cpu都是分核。每個(gè)核就是一個(gè)小腦袋??梢岳斫庖恍亩嘤谩W屆總€(gè)核都作用起來,去干不同的事情,這種方法是就叫多進(jìn)程。
一、程序、線程、進(jìn)程
1、程序:一個(gè)應(yīng)用就可以理解為一個(gè)程序。
2、進(jìn)程:程序運(yùn)行資源分配的最小單位,一個(gè)程序可以有多個(gè)進(jìn)程。
3、線程:cpu最小的調(diào)度單位,必須依賴進(jìn)程存在。線程是沒有獨(dú)立資源的,所有的線程共享他所在進(jìn)程的所有資源。
二、什么是多線程?
程序中包含多個(gè)并行的線程來完成不同的任務(wù)。
三、python中的threading模塊
1、創(chuàng)建多線程的第一種方法
1 t =threading.Thread(2 target =方法名,3 args = (,) #參數(shù)列表,元組
4 )5 t.start() #啟動(dòng)線程
2、查看線程的數(shù)量:threading.enumerate()
1 enumerate(2 可迭代對(duì)象,3 i, #表示索引從i開始。
4 ) #python的內(nèi)置函數(shù):枚舉可迭代對(duì)象,同時(shí)獲取迭代對(duì)象的每個(gè)值和其索引。
可迭代對(duì)象:有__iter__屬性的對(duì)象。
迭代器:有__iter___和__next__屬性的對(duì)象。
這兩個(gè)如何轉(zhuǎn)化:迭代器=iter(可迭代對(duì)象)
可迭代對(duì)象都有:list,tuple,dict,str,bytesarray,set,fp
3、創(chuàng)建第二種方法:自定線程類
(1)python的繼承
①繼承是通過在定義類的時(shí)候,類后面的()中添加父類來實(shí)現(xiàn)的。
②被繼承的類稱為父類,繼承的類稱為子類。
③子類繼承父類所有非私有的屬性及方法。
④如果子類重寫父類的屬性和方法,子類默認(rèn)是優(yōu)先拿自己的。
(2)用自定義線程的步驟
①繼承threading.Thread
②重寫run方法:
③實(shí)例化這個(gè)類,就相當(dāng)于創(chuàng)建了一個(gè)線程。
t = MyThread()
t.start()---默認(rèn)執(zhí)行就是run方法里面的內(nèi)容。
④如果自定義線程要傳參數(shù),這時(shí)候必須要寫init方法。必須在init中先調(diào)用父類的init(初始化父類。)
(3)調(diào)用父類的init方法有兩種方法
super().__init__()
threading.Tread.__init__(self)
4、線程的名稱:線程.name查看線程的名稱
如果沒有給線程自定義名稱,默認(rèn)線程的名稱是:Thread-1,Thread-2,....
自定義名稱:
t = MyThread(name=str(i))
t.start()
5、線程的五種狀態(tài)
線程的執(zhí)行順序是混亂:線程是cup調(diào)度的最小單位,線程的執(zhí)行完全是由cpu調(diào)度所決定的。cpu如何來調(diào)度呢?是由線程狀態(tài)決定。
6、線程間公用數(shù)據(jù)的共享問題
多個(gè)線程多全局變量的更改,容易造成數(shù)據(jù)的混亂。
解決辦法:將線程對(duì)公有數(shù)據(jù)更改部分,用互斥鎖鎖起來,這兩就可以解決這種問題。
多線程避免多個(gè)線程同時(shí)處理公有變量?!怦睢?/p>
1 importthreading2
3 mutex = threading.Lock() #創(chuàng)建一個(gè)鎖對(duì)象
4
5 if mutex.acquire(): #上鎖
6
7 '''
8 公有數(shù)據(jù)的處理代碼9 '''
mutex.release()#釋放鎖
mutex.acquire(True):默認(rèn)情況就是True,線程到鎖這里如果沒有獲取鎖狀態(tài),就會(huì)被阻塞。
mutex.acquire(False):線程到鎖這里如果沒有獲取鎖狀態(tài),不會(huì)被阻塞。
四、多進(jìn)程和多線程
1、并發(fā)和并行
2、多線程和多進(jìn)程的優(yōu)缺點(diǎn)
多線程
(1)多線程的優(yōu)點(diǎn)
所有線程可以直接共享內(nèi)存和變量,線程之間的通信變得容易。
線程方式消耗的總資源比進(jìn)程方式少。
(2)多線程缺點(diǎn)
程序邏輯和控制方式復(fù)雜。
線程之間的同步和加鎖比較麻煩。
一個(gè)線程崩潰可能影響到整個(gè)程序的穩(wěn)定性。
多進(jìn)程
(1)多進(jìn)程優(yōu)點(diǎn)
每個(gè)進(jìn)程都相互獨(dú)立,不影響主程序的穩(wěn)定性,子進(jìn)程崩潰,主程序收到影響比較小。
通過增加cup,可以輕松擴(kuò)展性能。
每個(gè)子進(jìn)程都有2GB地址空間和相關(guān)資源,總體性能能夠達(dá)到的上限非常大。
(2)多進(jìn)程的缺點(diǎn)
邏輯控制復(fù)雜,需要和主程序交互。----進(jìn)程之間通信是很困難度。
如果有大量數(shù)據(jù)傳送,需要跨進(jìn)程邊界。適合小數(shù)量數(shù)據(jù)傳送的程序。
多進(jìn)程和多線程如何選擇:在實(shí)際開發(fā)中,選擇多線程還是多進(jìn)程,應(yīng)該從具體實(shí)際開發(fā)來進(jìn)行選擇。最好是多進(jìn)程和多線程結(jié)合,即根據(jù)實(shí)際的需求,每個(gè)cpu開啟一個(gè)子進(jìn)程,這個(gè)子進(jìn)程開啟多個(gè)線程進(jìn)程數(shù)據(jù)處理。
五、死鎖
產(chǎn)生死鎖的兩中情況
1、同一個(gè)線程,先后獲取兩次鎖對(duì)象,就會(huì)產(chǎn)生死鎖。
2、A獲取鎖1,B獲取鎖2,A在不釋放鎖1的情況試圖獲取鎖2,B在不釋放鎖2的情況下試圖獲取鎖1,此時(shí)就會(huì)產(chǎn)生死鎖。
總結(jié)
以上是生活随笔為你收集整理的python结束进程树_【python爬虫】线程进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 充值游戏钱怎么申请退款
- 下一篇: python导入pandas具体步骤方法