python实现多线程输出123123
同時開啟三個線程,分別只能輸出1,2,3,并讓三個線程按順序輸出打印123123123…
這道問題簡單來說就是一種紅綠燈,我們先讓紅燈亮,過一段時間后黃燈亮,再過一段時間后綠燈量,以此類推。一般對于多線程而言,可以很容易的實現這三種顏色的切換,但是再不對其進行控制的話,他的執行順序將會是亂的,其可能在紅燈之后還是紅燈,綠燈之后還是綠燈(這要是在現實中將會引發巨大的災難),因此要實現多線程之間的順序執行,我們就需要使用到鎖的概念,也就是Python中的GIL、同步鎖(互斥鎖)、遞歸鎖(用來解決死鎖,當有多個互斥鎖存在的時候,可能會導致死鎖),對于Python中鎖的概念不進行闡述,我們在這里直接使用Threading.Lock來解決上述問題。
實現多線程的順序執行,關鍵在于如何控制上鎖lock.acquire()與鎖的釋放lock.release()。在這里我們可以將紅綠燈的各種顏色的切換看作是上鎖與釋放鎖。一開始是紅燈亮,因此,在初始時刻對于紅黃綠的三種鎖中,只有紅燈的鎖是釋放的,而黃燈和綠燈的鎖是被鎖著的,這樣一來只有紅燈的線程可以進入得到資源,從而顯示為紅燈,這里需要注意的是紅燈的線程進入后,應將其鎖給鎖住,而不讓其他線程進入(紅燈亮著的時候,三個鎖都是鎖住的);當紅燈顯示時間結束后,下一個為黃燈,因此需要將黃燈的鎖給釋放掉,從而讓黃燈的線程進入,進入后再將鎖鎖住;當黃燈顯示完畢后,將綠燈的鎖給打開,從而讓綠燈顯示,以此類推。
完整代碼如下:
import threading import timered_lock = threading.Lock() # 紅燈鎖 yellow_lock = threading.Lock() # 黃燈鎖 green_lock = threading.Lock() # 綠燈鎖count = 18 # 為避免一直循環,我們在這里假設每個數字輸出6次,3×6=18def red():"""紅燈顯示函數"""global countwhile count >= 0:red_lock.acquire() # 將紅燈的鎖給鎖住print(1, end = '-') # 將紅燈表示為1# print('id:', threading.get_ident()) # 查看線程idyellow_lock.release() # 下一個為黃燈亮,將黃燈的鎖給釋放count -= 1def yellow():"""黃燈顯示函數"""global countwhile count >= 0:yellow_lock.acquire() # 將黃燈的鎖給鎖住print(2, end = '-') # 將黃燈表示為2# print('id:', threading.get_ident())green_lock.release() # 下一個為綠燈亮,將綠燈的鎖給釋放count -= 1def green():"""綠燈顯示函數"""global countwhile 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)thread_list.append(th)# 紅燈先亮,因此將黃燈和綠燈的鎖給鎖住,以阻塞線程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实现多线程输出123123的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中西方对时间的差异_中西方时间观念的不同
- 下一篇: python 将目下的excel全部转x