同時開啟三個執行緒,分別只能輸出1,2,3,並讓三個執行緒按順序輸出列印123123123…
這道問題簡單來說就是一種紅綠燈,我們先讓紅燈亮,過一段時間後黃燈亮,再過一段時間後綠燈量,以此類推。一般對於多執行緒而言,可以很容易的實現這三種顏色的切換,但是再不對其進行控制的話,他的執行順序將會是亂的,其可能在紅燈之後還是紅燈,綠燈之後還是綠燈(這要是在現實中將會引發巨大的災難),因此要實現多執行緒之間的順序執行,我們就需要使用到鎖的概念,也就是python中的gil、同步鎖(互斥鎖)、遞迴鎖(用來解決死鎖,當有多個互斥鎖存在的時候,可能會導致死鎖),對於python中鎖的概念不進行闡述,我們在這裡直接使用threading.lock
來解決上述問題。
實現多執行緒的順序執行,關鍵在於如何控制上鎖lock.acquire()
與鎖的釋放lock.release()
。在這裡我們可以將紅綠燈的各種顏色的切換看作是上鎖與釋放鎖。一開始是紅燈亮,因此,在初始時刻對於紅黃綠的三種鎖中,只有紅燈的鎖是釋放的,而黃燈和綠燈的鎖是被鎖著的,這樣一來只有紅燈的執行緒可以進入得到資源,從而顯示為紅燈,這裡需要注意的是紅燈的執行緒進入後,應將其鎖給鎖住,而不讓其他執行緒進入(紅燈亮著的時候,三個鎖都是鎖住的);當紅燈顯示時間結束後,下乙個為黃燈,因此需要將黃燈的鎖給釋放掉,從而讓黃燈的執行緒進入,進入後再將鎖鎖住;當黃燈顯示完畢後,將綠燈的鎖給開啟,從而讓綠燈顯示,以此類推。
完整**如下:
import threading
import time
red_lock = threading.lock(
)# 紅燈鎖
yellow_lock = threading.lock(
)# 黃燈鎖
green_lock = threading.lock(
)# 綠燈鎖
count =
18# 為避免一直迴圈,我們在這裡假設每個數字輸出6次,3×6=18
defred()
:"""紅燈顯示函式"""
global count
while count >=0:
red_lock.acquire(
)# 將紅燈的鎖給鎖住
print(1
, end =
'-')
# 將紅燈表示為1
# print('id:', threading.get_ident()) # 檢視執行緒id
yellow_lock.release(
)# 下乙個為黃燈亮,將黃燈的鎖給釋放
count -=
1def
yellow()
:"""黃燈顯示函式"""
global count
while count >=0:
yellow_lock.acquire(
)# 將黃燈的鎖給鎖住
print(2
, end =
'-')
# 將黃燈表示為2
# print('id:', threading.get_ident())
green_lock.release(
)# 下乙個為綠燈亮,將綠燈的鎖給釋放
count -=
1def
green()
:"""綠燈顯示函式"""
global count
while count >=0:
green_lock.acquire(
)# 將綠燈的鎖給鎖住
print(3
, end =
'-')
# 將綠燈表示為2
# print('id:', threading.get_ident())
red_lock.release(
)# 下乙個為紅燈亮,將紅燈的鎖給釋放
count -=
1if __name__ ==
'__main__'
: thread_list =
func_list =
[red, yellow, green]
for func in func_list:
# 建立三個執行緒
th = threading.thread(target = func)
# 紅燈先亮,因此將黃燈和綠燈的鎖給鎖住,以阻塞執行緒2和3的執行
yellow_lock.acquire(
)# 2上鎖
green_lock.acquire(
)# 3上鎖
for th in thread_list:
# print(time.time()) # 用於判斷啟動時間
th.start(
)for th in thread_list:
th.join(
)
執行結果為:
1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-
上面的判斷啟動時間的是用來看是否是同時啟動的,由於for迴圈是有順序的,因此三個執行緒的啟動並不是同時的,雖然有些時候輸出的時間會相同,但其實是不同的。
好好學習,天天向上。
python多執行緒實現
資料夾命名不能用官方已有的模組名比如threading.py test.py等等都會報錯 from multiprocessing import process import os 子程序要執行的 def run proc name print run child process s s name,...
python多執行緒實現
coding utf 8 import threading 匯入執行緒模組 from time import ctime,sleep 建立執行緒事件 defeat print 我在吃東西 s ctime 執行緒組 threads 建立執行緒數量 for x in range 10 t1 thread...
python多執行緒執行緒池實現
在python中多執行緒可以使用threading來實現,但實際使用時考慮效能等,大多會使用到執行緒池,下面就是基於python2和python3來說明下執行緒池的使用。import time def testthread fl time.sleep 1 print print fl return ...