python實現多執行緒輸出123123

2021-09-19 06:29:40 字數 2580 閱讀 2798

同時開啟三個執行緒,分別只能輸出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 ...