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