當前位置:編程學習大全網 - 編程語言 - python如何打印123行?

python如何打印123行?

同時打開三個線程,分別只能輸出1,2,3,讓三個線程輸出打印123123123…

這個問題簡直就是紅綠燈的壹種。我們先讓紅燈亮,過壹會黃燈亮,過壹會綠燈亮,以此類推。壹般來說,對於多線程來說,很容易切換這三種顏色,但是如果不控制的話,它的執行順序會比較混亂,可能是紅燈之後或者紅燈之後,綠燈之後或者綠燈之後(這在現實中會造成巨大的災難),所以要實現多線程之間的順序執行,就需要用到鎖的概念。即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循環是順序的,所以三個線程不會同時啟動。雖然有時候輸出時間會壹樣,但其實是不壹樣的。

  • 上一篇:java培訓課程表?
  • 下一篇:什麽叫創新創業教育類公***選修課程
  • copyright 2024編程學習大全網