日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程—事件Event

發布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程—事件Event 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程的一個關鍵特性是每個線程都是獨立運行且狀態不可預測。如果程序中的其他線程需要通過判斷某個線程的狀態來確定自己下一步的操作,這時線程同步問題就會變得非常棘手。為了解決這些問題,我們需要使用threading庫中的Event對象。對象包含一個可由線程設置的信號標志,它允許線程等待某些事件的發生。

在初始情況下,Event對象中的信號標志被設置為假。如果有線程等待一個Event對象,而這個Event對象的標志為假,那么這個線程將會被一直阻塞直至該標志為真。一個線程如果將一個Event對象的信號標志設置為真;它將喚醒所有等待這個Event對象的線程。如果一個線程等待一個已經被設置為真的Event對象,那么它將忽略這個事件,繼續執行

Event()可以創建一個事件管理標志,該標志(event)默認為False,event對象主要有四種方法可以調用:
event.wait(timeout=None):調用該方法的線程會被阻塞,如果設置了timeout參數,超時后,線程會停止阻塞繼續執行;
event.set():將event的標志設置為True,調用wait 方法的所有線程將被喚醒;
event.clear():將event的標志設置為Fa1se,調用wait方法的所有線程將被阻塞;
event.is_set():判斷event的標志是否為True。

需求:
線程1,代表門,一開始是打開的,每3秒需要自動關閉一下,如果有人通過,需要重新刷卡打開
線程2,代表人,人通過門,如果門是打開的直接通過,如果沒有打開需要刷卡,之后門就已經打開了,通知人繼續進入

import threading import time import randomevent = threading.Event() # 創建一個事件,事件默認為假 event.set() # 設置標志為真,門一開始是打開的 status = 0 # 代表門的狀態,如果是0-3(不包括3)代表打開,如果等于3,代表關閉def door():global statuswhile True:print('當前門的status為{}'.format(status))if status >= 3:print('當前門已經打開了3s,需要自動關閉')event.clear()if event.is_set():print('當前門是開的,可以通行')else:print('門已經關了,請用戶自己刷卡')# status=0 #原來已經等于3了event.wait() # 門的線程阻塞等待continuetime.sleep(1)status += 1 # status代表門開始的秒數def person():global statusn = 0 # 人的計數器,看看有多少人進入門里面while True:if event.is_set():n += 1print('門開的,{}號人進入門里面'.format(n))else:print('門關著,{}號人刷卡,進入門里面'.format(n))event.set() # 標志改為truestatus = 0time.sleep(random.randint(1, 10))if __name__ == '__main__':d = threading.Thread(target=door)p = threading.Thread(target=person)d.start()p.start()

總結

以上是生活随笔為你收集整理的多线程—事件Event的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。