python 使用多執行緒進行併發程式設計 互斥鎖的使用

2022-05-01 23:51:10 字數 2628 閱讀 5880

import

threading

import

time

"""python的thread模組是比較底層的模組,python的threading模組是對thread做了一些包裝的,可以更加方便的被使用

多執行緒程式的執行順序是不確定的,當執行緒被阻塞(blocked)時,執行緒掛起,阻塞結束後,執行緒進入就緒(runnable)狀態,等待排程。

而執行緒排程將自行選擇乙個執行緒執行。只能保證每個執行緒都執行完整個run函式,但是執行緒的啟動順序、run函式中每次迴圈的執行順序都不能確定。

也就是說:

1.每個執行緒預設有乙個名字,儘管上面的例子中沒有指定執行緒物件的name,但是python會自動為執行緒指定乙個名字。

2.當執行緒的run()方法結束時該執行緒完成。

3.無法控制線程排程程式,但可以通過別的方式來影響執行緒排程的方式。

"""g_num =0

deftest_thread_1():

print("

test_thread_1 子執行緒被呼叫, 休眠2秒")

time.sleep(2)

print("

test_thread_1 子執行緒執行結束")

deftest_mutex_1(mutex, num):

#宣告使用全域性變數

global

g_num

for i in

range(num):

if mutex.acquire(true): #

上鎖,true表示進行堵塞,也就是說如果上鎖失敗,就阻塞在這一步,直到上鎖成功

g_num += 1

#釋放鎖mutex.release()

deftest_mutex_2(mutex, num):

#宣告使用全域性變數

global

g_num

for i in

range(num):

if mutex.acquire(true): #

上鎖,true表示進行堵塞,也就是說如果上鎖失敗,就阻塞在這一步,直到上鎖成功

g_num += 1

#釋放鎖mutex.release()

class mythread(threading.thread): #

繼承自threading.thread類

"""為了讓每個執行緒的封裝性更完美,所以使用threading模組時,往往會定義乙個新的子類class,

只要繼承threading.thread就可以了,然後重寫run方法

"""#

重寫run方法

defrun(self):

#name屬性,當前執行緒的名字

print("

自己封裝的執行緒類,當前執行緒名字:%s

" %self.name)

#python的threading.thread類有乙個run方法,用於定義執行緒的功能函式,

#可以在自己的執行緒類中覆蓋該方法。而建立自己的執行緒例項後,通過thread類的start方法,

#可以啟動該執行緒,交給python虛擬機器進行排程,當該執行緒獲得執行的機會時,就會呼叫run方法執行執行緒。

defmake_thread():

#將函式引用使用target命名引數進行傳遞,建立子執行緒

thread = threading.thread(target=test_thread_1)

#啟動子執行緒

thread.start()

# 自定義的執行緒類

my_thread =mythread()

my_thread.start()

#建立乙個互斥鎖

#這個鎖預設是未上鎖的狀態

mutex =threading.lock()

t1 = threading.thread(target=test_mutex_1, args=(mutex, 1000000, ))

t1.start()

t2 = threading.thread(target=test_mutex_2, args=(mutex, 1000000, ))

t2.start()

#預設情況下,主線程會等待子執行緒

#t1 執行緒阻塞, 當t1完成執行後再進行下一步操作

#t1.join()

#t1 執行緒守護主線程

#t1.daemon = true

#獲取當前程序下的所有執行緒數量(包含主線程)

#length = len(threading.enumerate())

#print("執行緒數量:%d" % length)

#print("主線程執行到最後一行")

while

true:

length =len(threading.enumerate())

if length == 1:

return

g_num

else

: time.sleep(0.2)

num =make_thread()

print(num)

輸出:

test_thread_1 子執行緒被呼叫, 休眠2秒

自己封裝的執行緒類,當前執行緒名字:thread-2test_thread_1 子執行緒執行結束

2000000

Python多執行緒,併發

單執行緒程式只有乙個 手指 但多執行緒的程式有多個 手指 每個 手指 仍然移動到控制流語句定義的下一行 但這些 手指 可以在程式的不同地方,同時執行不同的 行 你可以使用 python 的threading 模組,在單獨的執行緒中執行延遲或安排的 這個單獨的執行緒將因為 time.sleep 呼叫而...

python併發程式設計 多執行緒 執行緒理論

一 什麼是執行緒 在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程 執行緒顧名思義,就是一條流水線工作的過程 流水線的工作需要電源,電源就相當於cpu 而一條流水線必須屬於乙個車間,乙個車間的工作過程是乙個程序,車間負責把資源整合到一起,是乙個資源單位,而乙個車間內至少有一條流水線...

多執行緒併發

多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...