原因:遊戲項目中,必須三個人才能進入下一關遊戲,不然就算超時等待或退出遊戲
# coding=utf-8
import logging
import threading
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [*] %(threadName)s %(message)s"
)
number = 7
threads = []
def open ():
logging.info("我們三個進去吧----------------------[*]")
class Open_door(threading.Thread):
def __init__ (self, *args, **kwargs):
super().__init__(*args, **kwargs)
def run (self):
try:
# 重置柵欄爲默認的初始態
# barrier.reset() # 可以註釋,結果不一樣
# 如果屏障不是處於損壞狀態
if not barrier.broken:
# 返回當前在屏障處等待的線程數
logging.info(f' 在等着開門——》等待人數(線程):數量{(barrier.n_waiting + 1)} ')
# 比如7個線程和三個柵欄,等待中的線程夠三個,就通過柵欄,否則2秒後,就按超時異常
barrier.wait(2)
logging.info(f' 進入下一關遊戲')
except threading.BrokenBarrierError:
logging.info("超時等待或退出遊戲(發生了超時柵欄破損或重置)")
class Manager(threading.Thread):
def run (self):
logging.info('這遊戲不開了,關門了!!!')
barrier.abort()
if __name__ == '__main__':
barrier = threading.Barrier(3, open)
logging.info(f"穿過屏障所需的線程數(必須三個人):{(barrier.parties)}")
# 創建7個線程--------------------------------------------
for i in range(number):
threads.append(Open_door(name='A-%s' % i))
# 讓前面兩人重新排隊-------------------------------------
# threads.insert(2, Manager()) # 可以註釋,結果不一樣
# 阻塞啓動線程-------------------------------------------
for t in threads:
t.start()
for t in threads:
t.join()
輸出:
2019-10-02 23:11:44,253 [*] MainThread 穿過屏障所需的線程數(必須三個人):3
2019-10-02 23:11:44,254 [*] A-0 在等着開門——》等待人數(線程):數量1
2019-10-02 23:11:44,255 [*] A-1 在等着開門——》等待人數(線程):數量2
2019-10-02 23:11:44,255 [*] A-2 在等着開門——》等待人數(線程):數量3
2019-10-02 23:11:44,256 [*] A-2 我們三個進去吧----------------------[*]
2019-10-02 23:11:44,256 [*] A-2 進入下一關遊戲
2019-10-02 23:11:44,256 [*] A-1 進入下一關遊戲
2019-10-02 23:11:44,256 [*] A-0 進入下一關遊戲
2019-10-02 23:11:44,256 [*] A-3 在等着開門——》等待人數(線程):數量1
2019-10-02 23:11:44,257 [*] A-4 在等着開門——》等待人數(線程):數量2
2019-10-02 23:11:44,257 [*] A-5 在等着開門——》等待人數(線程):數量3
2019-10-02 23:11:44,257 [*] A-5 我們三個進去吧----------------------[*]
2019-10-02 23:11:44,257 [*] A-5 進入下一關遊戲
2019-10-02 23:11:44,258 [*] A-3 進入下一關遊戲
2019-10-02 23:11:44,258 [*] A-4 進入下一關遊戲
2019-10-02 23:11:44,259 [*] A-6 在等着開門——》等待人數(線程):數量1
2019-10-02 23:11:46,259 [*] A-6 超時等待或退出遊戲(發生了超時柵欄破損或重置)
Process finished with exit code 0