Python並發編程:多線程-訊號量,Event,定時器

來源:互聯網
上載者:User

標籤:timer   訊號量   連結   使用   個人   有一個   作業系統   租房   預測   

一 訊號量

  訊號量也是一把鎖,可以指定訊號量為5,對比互斥鎖同一時間只能有一個任務搶到鎖去執行,訊號量同一時間可以有5個任務拿到鎖去執行,如果說互斥鎖是合租房屋的人去搶一個廁所,那麼訊號量就相當於一群路人爭搶公用廁所,公用廁所所有多個坑位,這意味著同一時間可以有多個人上公用廁所,但公用廁所容納的人數是一定的,這便是訊號量的大小

from threading import Thread, Semaphoreimport threadingimport timedef func():    sm.acquire()    print(‘%s get sm‘ % threading.current_thread().getName())    time.sleep(3)    sm.release()if __name__ == ‘__main__‘:    sm = Semaphore(5)    for i in range(23):        t = Thread(target=func)        t.start()

  解析

Semaphore管理一個內建的計數器,每當調用acquire()時內建計數器-1調用release()時內建計數器+1計數器不能小於0;當計數器為0時,acquire()將阻塞線程直到其它線程調用rel()

  

二、Event

線程的一個關鍵特性是每個線程都是獨立運行且狀態不可預測。如果程式中的其它線程需要通過判斷某個線程的狀態來確定自己下一步的操作,這時線程同步問題就會變得非常棘手。為瞭解決這些問題,我們需要使用threading庫中的Event對象。對象包含一個可由線程設定的訊號標誌,它允許線程等待某些事件的發生。在初始情況下,Event對象中的訊號標誌被設定為假。如果有線程等待一個Event對象,而這個Event對象的標誌為假,那麼這個線程將會被一直阻塞至標誌為真。一個線程如果將一個Event對象的訊號標誌設定為真,它將喚醒所有等待這個Event對象的線程。如果一個線程等待一個已經被設定為真的Event對象,它將忽略這個事件,繼續執行

from threading import EventEvent.isSet()   # 返回Event的狀態值Event.wait()    # 如果event.isSet()==False將阻塞線程;Event.set()     # 設定Event的狀態值為True,所有阻塞池的線程啟用進入就緒狀態,等待作業系統調度Event.clear()   # 恢複Event的狀態值為False

 

 

 例如:有多個背景工作執行緒嘗試連結MySQL,我們想要在連結前確保MySQL服務正常才讓那些背景工作執行緒去串連MySQL伺服器,如果串連不成功,都會去嘗試重新串連。那麼

from threading import Thread, Eventimport threadingimport time, randomdef conn_mysql():    count = 1    while not event.is_set():        if count > 3:            raise TimeoutError(‘連結逾時‘)        print(‘<%s>第%s次嘗試連結‘ % (threading.current_thread().getName(), count))        event.wait(0.5)        count += 1    print(‘<%s>連結成功‘ % threading.current_thread().getName())def check_mysql():    print(‘\033[45m[%s] 正在檢查mysql\033[0m‘ % threading.current_thread().getName())    time.sleep(random.randint(2, 4))    event.set()if __name__ == ‘__main__‘:    event = Event()    conn1 = Thread(target=conn_mysql)    conn2 = Thread(target=conn_mysql)    check = Thread(target=check_mysql)    conn1.start()    conn2.start()    check.start()

  

三 定時器

定時器,指定n秒後執行某操作

from threading import Timerdef hello():    print(‘hello, world‘)t = Timer(1, hello)t.start()

  

 

Python並發編程:多線程-訊號量,Event,定時器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.