信号量模式之 ReusableBarrier

ReusableBarrier 模式可以保证一组线程可以全部执行到某一语句后才继续往下执行。

# -*- coding: utf-8 -*-
import threading
import time
from threading import Semaphore, Thread


class ReusableBarrierClass:
    def __init__(self, thread_count):
        self.thread_count = thread_count
        self.count = 0
        self.mutex = Semaphore(1)
        self.turnstile = Semaphore(0)
        self.turnstile2 = Semaphore(1)

    def __enter__(self):
        self.mutex.acquire()
        self.count += 1
        if self.count == self.thread_count:
            print(u"当前线程号", threading.currentThread().getName(), u" turnstile 打开")
            self.turnstile.release()
            self.turnstile2.acquire()
        self.mutex.release()

        self.turnstile.acquire()
        self.turnstile.release()

    def __exit__(self, exc_type, exc_value, traceback):
        self.mutex.acquire()
        self.count -= 1
        if self.count == 0:
            print(u"当前线程号", threading.currentThread().getName(), u" turnstile 重新关闭")
            self.turnstile.acquire()
            self.turnstile2.release()
        self.mutex.release()

        self.turnstile2.acquire()
        self.turnstile2.release()


barrier = ReusableBarrierClass(3)


def worker(br, idx):
    print(u"当前线程号", threading.currentThread().getName(), u" 函数进入")
    with br:
        print(u"当前线程号", threading.currentThread().getName(), u" 正在执行")
        time.sleep(idx * 2)
        print(u"当前线程号", threading.currentThread().getName(), u" 执行完毕")
    print(u"当前线程号", threading.currentThread().getName(), u" 函数退出执行")


for i in range(barrier.thread_count):
    Thread(target=worker, args=(barrier, i)).start()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 三年级的第一个感受,早上去学校,我去吃粉,小姑娘可以自己走路进学校,也会主动跟值日老师打招呼。 开学典礼上,蜗牛与...
    木木王_deb5阅读 283评论 0 0
  • 明天下午就要期末考试了,所以今天没领儿子出去玩,想让他多复习复习。给他准备了四张试卷,中午带了两张到他妈妈单...
    王科棋阅读 270评论 0 0