這個問題簡直就是紅綠燈的壹種。我們先讓紅燈亮,過壹會黃燈亮,過壹會綠燈亮,以此類推。壹般來說,對於多線程來說,很容易切換這三種顏色,但是如果不控制的話,它的執行順序會比較混亂,可能是紅燈之後或者紅燈之後,綠燈之後或者綠燈之後(這在現實中會造成巨大的災難),所以要實現多線程之間的順序執行,就需要用到鎖的概念。即Python中的GIL、同步鎖(互斥鎖)和遞歸鎖(用於解決死鎖,有多個互斥鎖時可能導致死鎖)。Python中不細說鎖的概念,直接用線程。鎖在這裏解決以上問題。
要實現多線程的順序執行,關鍵在於如何控制加鎖的lock.acquire()和釋放的lock.release()。這裏我們可以把紅綠燈的各種顏色的切換看成鎖死和開鎖。起初,紅燈亮著。所以在初始時刻,紅黃綠三個鎖中,只有紅燈的鎖被釋放,黃燈綠燈的鎖被鎖定,這樣只有紅燈的線程才能進入獲取資源,顯示為紅燈。這裏需要註意的是,紅燈的線程進入後,要鎖死,防止其他線程進入(紅燈亮時,三把鎖都鎖死);紅燈顯示時間結束,下壹個是黃燈,需要解除黃燈的鎖,讓黃燈的線程進入,進入後再鎖好鎖;黃燈顯示時,解鎖綠燈,使綠燈顯示,以此類推。
完整的代碼如下:
導入線程
導入時間
Red_lock =線程。Lock() #紅燈鎖
黃色_鎖=線程。Lock() #黃燈鎖
Green_lock =線程。Lock() #綠燈鎖
Count = 18 #為了避免連續循環,我們假設每個數輸出6次,3×6=18。
def red():
" ""紅燈顯示功能" " "
全局計數
while count & gt= 0:
Red_lock.acquire() #鎖定紅燈的鎖。
Print(1,end = '-') #表示紅燈為1。
# print ('id:',threading.get _ ident ()) #查看線程id
Yellow_lock.release() #接下來黃燈亮,黃燈的鎖定解除。
計數-= 1
def黃色():
" ""黃燈顯示功能" " "
全局計數
while count & gt= 0:
Yellow_lock.acquire() #鎖定黃燈。
Print(2,end = '-') #表示黃燈為2。
# print('id:',threading.get_ident())
Green_lock.release() #接下來綠燈亮了,解除綠燈的鎖定。
計數-= 1
def green():
" ""綠燈顯示功能" " "
全局計數
while count & gt= 0:
Green_lock.acquire() #鎖定綠燈。
Print(3,end = '-') #表示綠燈為2。
# print('id:',threading.get_ident())
Red_lock.release() #下壹個是紅燈,紅燈的鎖被釋放。
計數-= 1
if __name__ == '__main__ ':
thread_list = []
func _ list =[紅色、黃色、綠色]
對於func_list中的func:#創建三個線程。
th =線程。線程(target = func)
thread_list.append
#紅燈先亮,所以鎖定黃燈和綠燈來阻塞線程2和3的執行。
Yellow_lock.acquire() # 2鎖
Green_lock.acquire() # 3鎖
對於線程列表中的th:
# print(time.time()) #用於判斷啟動時間。
th.start()
對於線程列表中的th:
th.join()
登錄後復制
實施結果是:
1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-
登錄後復制
上面判斷開始時間的目的是看兩者是否同時開始。因為for循環是順序的,所以三個線程不會同時啟動。雖然有時候輸出時間會壹樣,但其實是不壹樣的。