Python 多執行緒與多程序

2021-08-22 07:26:13 字數 2681 閱讀 5954

前言:以前玩單機或者玩小資料集,都基本不用多執行緒或多程序都能基本滿足需求了…所以沒怎麼了解這方面的東西。但現在玩幾百萬甚至上千萬的資料,甚至集群等東西之後,就有必要學習多執行緒或多程序了。

在python中首先要匯入相關的模組

import threading as td

import multiprocessing as mp

檢視執行緒資訊

td.active_count() #獲取當前執行緒數

td.current_thread() #獲取當前執行的執行緒資訊

td.enumerate() #獲取所有執行緒資訊

假設當前有乙個函式

def func(x):

print(x**2)

新增執行緒,並啟動

thread1 = td.thread(target=func, args=(2,))

thread1.start()

這裡有兩點需要注意:

a. target 的引數為函式的引用,所以是 func 而不是 func()。

b. args 的引數為迭代器 iterator,所以當引數只有乙個值時不能把 ',' 給忘了,是(2, )而不是(2)。引數有兩個值時不用在末尾加','。

守護執行緒

thread1.setdaemon()
假設當前主線程為 td,子執行緒有 thread1。在主線程 td 中設定 thread1.setdaemon() 的意思是,將 thread1 設定為守護執行緒,那麼當 td 結束後,不管 thread1 執行緒有沒有結束,整個程式都會結束掉,而不會等 thread1 結束,即子執行緒隨主線程結束而結束。

執行緒同步

thread1.join()
但如果你在 setdaemon 之後,再加入 thread1.join(),執行到這一語句時,會進入執行緒阻塞狀態,其他的執行緒會等到 thread1 執行緒結束之後再執行其他的。

獲取執行緒返回值

由於在多執行緒函式中不能返回值,但可以利用佇列來實現儲存結果。

from queue import queue

q = queue() #定義乙個物件q

q.put(value) #將value加入佇列中

q.get() #獲取佇列中的值

這時候,多執行緒函式 func(x, q) 則需要多乙個引數把 q 傳進去

執行緒鎖

有的時候,執行緒之間需要有先後順序,那麼就需要執行緒鎖這個東西

lock = td.lock()

lock.acquire() #在函式func1中開始的時候加入鎖

lock.release() #在函式func1中結束的時候釋放

gil

關於 python 的多執行緒,還需要了解到它的乙個效能問題。python 的 threading 對於處理 i/o 的程式加速效果更好一些,但是對於計算密集型的程式則未必。最主要的原因是, python 的設計上, 有乙個必要的環節, 就是 global interpreter lock (gil) 這個東西讓 python 還是一次性只能處理乙個東西。儘管python完全支援多執行緒程式設計,但是直譯器的c語言實現部分在完全並行執行時並不是執行緒安全的。實際上,直譯器被乙個全域性直譯器鎖保護著,它確保任何時候都只有乙個python執行緒執行。gil最大的問題就是python的多執行緒程式並不能利用多核cpu的優勢(比如乙個使用了多個執行緒的計算密集型程式只會在乙個單cpu上面執行)。gil只會影響到那些嚴重依賴cpu的程式(比如計算型的)。如果你的程式大部分只會涉及到i/o,比如網路互動,那麼使用多執行緒就很合適, 因為它們大部分時間都在等待。

對於 python 來說,多程序加速可以彌補多執行緒的短處。

多程序和多執行緒的用法有相似之處,如以下:

import multiprocessing as mp 

process1 = mp.process(target=func1,args=(2,))

process1.start()

process1.join()

此外,同樣的,多程序程式不能有返回值,但可以利用 queue。相似的東西還有程序鎖。

程序池

其實,利用程序池是可以呼叫有返回值的函式的,假設有函式

def func(x):

return x**2

利用程序池的map可以獲得相應的結果

pool = mp.pool()

res = pool.map(func, range(5))

輸入乙個 list, 返回乙個 list。

pool 預設的大小為 cpu 的核數,也可以指定核數

pool = mp.pool(processes=4)
res = pool_res.get()

如果需要處理多組引數,則只能用到迴圈

python 多執行緒與多程序

程序與執行緒的區別 程序 應用程式的執行例項,每乙個執行中的程式就是乙個程序 執行緒 程序的組成部分,乙個程序可以擁有多個執行緒 在多執行緒中,會有乙個主線程來完成整個程序從開始到結束的全部操作,而其他的執行緒會在主線程的執行過程中被建立或退出。python景區賣票系統 多執行緒的應用 import...

Python多執行緒與多程序

python多執行緒與多程序 程序 process 和執行緒 thread 是非常抽象的概念,也是程式設計師必需掌握的核心知識!多程序和多執行緒程式設計對於 的併發執行,提公升 效率和縮短執行時間至關重要。程序 process 和執行緒 thread 程序是作業系統分配資源的最小單元 執行緒是作業系...

python 多程序與多執行緒

由於python gil的存在,讓python 多執行緒很雞肋,很多時候如果有併發的需求,則選擇多程序來實現,但是多程序是很消耗資源的,而且程序之間不能資源共享,而且還會受到機器cpu核心數目的限制,因此在特定場景下針對不同需求會有一些取捨。傳聞對於io密集性的操作,比如,處理多個http 的請求,...