python中多執行緒 Python之多執行緒

2021-10-18 14:31:52 字數 1723 閱讀 8251

python之多執行緒

一、概念

1、多工可以由多程序完成,也可以由乙個程序內的多執行緒完成。

程序是由若干的執行緒組成,乙個程序至少有乙個程序。

執行緒是作業系統直接支援的執行單元,天賜高階預壓通常都是內建多執行緒的支援,python的執行緒是真正的posix thread而不是模擬出來的執行緒。

2、python的標準庫提供兩個模組:thread與threading,thread是第幾模組,threading是高階模組,對thread的封裝,絕大多數的情況下只需要使用threading這個高階模組。

3、啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start()開始執行。

二、實操

eg:import threading

def foo():

pass

t=threading.thread(target=foo)

t.start()

t.join()

print('this is main thread')

任何程序預設情況就會啟動乙個執行緒,把該執行緒稱為主線程,主線程又可以啟動新的執行緒。

threading.current_thread()永遠返回當前執行緒的例項。主線程的名字為mainthread,子執行緒的名字在建立時指定,用loopthread命名子執行緒,名字僅僅是在列印的時候會顯示。

三、lock

多執行緒和程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每乙個程序中,互不影響,而多執行緒中滿所有變數都是由所有執行緒共享。任何乙個變數都可以被任何乙個執行緒修改,因此執行緒之間的共享資料最大的危險在於多執行緒同時改乙個變數,把內容容易改亂,或者出現資源搶占的問題。

threading.lock()為執行緒上鎖,不會造成修改衝突。

threading.acquire()解鎖,其他執行緒即可獲得資源。

一般使用try finally來確保一定使用完後釋放鎖。

四、多核cpu

雖然python是真的多執行緒,但是python的直譯器執行**的時候有乙個gil鎖,任何python執行緒執行前,都必須先獲得gil鎖,每執行100條位元組碼,直譯器就自動的釋放gil鎖,讓別的執行緒有機會執行。

五、threadlocal

使用全域性變數在方法中使用threadlocal物件,每個thread對它都可以讀寫屬性,但是互不影響。

threadlocal最常用的地方就是胃每個執行緒繫結乙個資料庫連線。http請求,使用者身份資訊等,這樣乙個執行緒的所有呼叫到的處理函式都可以非常方便的訪問這些資源。

eg:import threading

local_school=threading.local()#建立全域性的threadlocal物件

def st1():

print('%s (in %s)'%(local_school.student, threading.current_thread(),name))

def st2(name):

#繫結threadlocal的st1

local_school.st1=name

st1()

t1=threading.thread(target=st2,args=('a1'),name='thread-a')

t2=threading.thread(target=st2,args=('b1'),name='thread-b')

t1.start()

t2.start()

t1.join()

t2.join()

python多執行緒 python多執行緒

通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...

莫煩pytho學習之多執行緒

多執行緒是什麼呢?多執行緒是加速程式計算的有效方式,python的多執行緒模組threading上手快速簡單 新增執行緒 import threading defadding thread print this is new thread s threading.current thread def...

python中的多執行緒

python中的多執行緒是假的多執行緒!為什麼這麼說,我們先明確乙個概念,全域性直譯器鎖 gil global interpreter lock python 的執行由python虛擬機器 直譯器 來控制,同時只有乙個執行緒在執行 對python虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...