Python threading Barrier柵欄(保存等待的線程對象,達到柵欄數量後,釋放柵欄)

原因:遊戲項目中,必須三個人才能進入下一關遊戲,不然就算超時等待或退出遊戲

# 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章