欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python多线程-Barrier(障碍对象)

程序员文章站 2022-03-13 19:21:29
Barrier(parties, action=None, timeout=None) 每个线程通过调用 尝试通过障碍,并阻塞,直到阻塞的数量达到 时,阻塞的线程被同时全部释放。 是一个可调用对象,当线程被释放时,其中一个线程会首先调用 ,之后再跑自己的代码。 时默认的超时时间。 方法: wait( ......

barrier(parties, action=none, timeout=none)

每个线程通过调用wait()尝试通过障碍,并阻塞,直到阻塞的数量达到parties时,阻塞的线程被同时全部释放。
action是一个可调用对象,当线程被释放时,其中一个线程会首先调用action,之后再跑自己的代码。
timeout时默认的超时时间。

方法:
wait(timeout=none)
尝试通过障碍并阻塞。
返回值是一个在0parties-1范围内的整数,每个线程都不同。
其中一个线程在释放之前将调用action。如果此调用引发错误,则障碍将进入断开状态。
如果等待超时,障碍也将进入断开状态。
如果在线程等待期间障碍断开重置,此方法可能会引发brokenbarriererror错误。

reset()
重置障碍,返回默认的空状态,即当前阻塞的线程重新来过。见例二

abort()
将障碍置为断开状态,这将导致已调用wait()或之后调用wait()引发brokenbarriererror。见例三

属性:
partier
通过障碍所需的线程数。

n_waiting
当前在屏障中等待的线程数

broken
如果屏障处于断开状态,则返回true

实例

例一:

# -*- coding:utf-8 -*-
import threading
import time


def open():
    print('人数够了, 开门!')


barrier = threading.barrier(3, open)


class customer(threading.thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.n = 3

    def run(self):
        while self.n > 0:
            self.n -= 1
            print('{0}在等着开门.'.format(self.name))
            try:
                barrier.wait(2)
            except threading.brokenbarriererror:
                pass
            print('开门了, go go go')


if __name__ == '__main__':
    t1 = customer(name='a')
    t2 = customer(name='b')
    t3 = customer(name='c')
    t1.start()
    t2.start()
    t3.start()

运行结果:

a在等着开门.
b在等着开门.
c在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
c在等着开门.
a在等着开门.
b在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
...

例二:

# -*- coding:utf-8 -*-
import threading
import time


def open():
    print('人数够了, 开门!')


barrier = threading.barrier(3, open)


class customer(threading.thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.n = 3

    def run(self):
        while self.n > 0:
            self.n -= 1
            print('{0}在等着开门.'.format(self.name))
            try:
                barrier.wait(2)
            except threading.brokenbarriererror:
                continue
            print('开门了, go go go')


class manager(threading.thread):
    def run(self):
        print('前面几个排队的不算,重新来')
        barrier.reset()


if __name__ == '__main__':
    t1 = customer(name='a')
    t2 = customer(name='b')
    t3 = customer(name='c')
    tm = manager()
    t1.start()
    t2.start()
    tm.start()
    t3.start()

运行结果:

a在等着开门.
b在等着开门.
前面几个排队的不算,重新来
a在等着开门.
b在等着开门.
c在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
a在等着开门.
c在等着开门.
b在等着开门.
人数够了, 开门!
开门了, go go go
开门了, go go go
开门了, go go go
c在等着开门.

例三:

# -*- coding:utf-8 -*-
import threading


def open():
    print('人数够了, 开门!')


barrier = threading.barrier(3, open)


class customer(threading.thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.n = 3

    def run(self):
        while self.n > 0:
            self.n -= 1
            print('{0}在等着开门.'.format(self.name))
            try:
                barrier.wait(2)
            except threading.brokenbarriererror:
                print('今天好像不开门了,回家.')
                break
            print('开门了, go go go')


class manager(threading.thread):
    def run(self):
        print('老板跟小姨子跑了,不开门了!')
        barrier.reset()


if __name__ == '__main__':
    t1 = customer(name='a')
    t2 = customer(name='b')
    t3 = customer(name='c')
    tm = manager()
    t1.start()
    t2.start()
    tm.start()
    t3.start()

运行结果:

a在等着开门.
b在等着开门.
老板跟小姨子跑了,不开门了!
今天好像不开门了,回家.
今天好像不开门了,回家.
c在等着开门.
今天好像不开门了,回家.