import threading
import logging
logging.basicConfig(level=logging.INFO,format='%(thread)d %(threadName)s %(message)s')
def work(barrier:threading.Barrier):
logging.info('n_waitting = {}'.format(barrier.n_waiting))
try:
bid = barrier.wait()
logging.info('after barrier {}'.format(bid))
except threading.BrokenBarrierError:
logging.info('Broken Barrier in {}'.format(threading.current_thread().name))
barrier = threading.Barrier(3)
for x in range(3):
threading.Thread(target=work,args=(barrier,)).start()
运行结果:
140666055436032 Thread-1 n_waitting = 0
140666047043328 Thread-2 n_waitting = 1
140666038650624 Thread-3 n_waitting = 2
140666038650624 Thread-3 after barrier 2
140666055436032 Thread-1 after barrier 0
140666047043328 Thread-2 after barrier 1
改进:
import threading
import logging
logging.basicConfig(level=logging.INFO,format='%(thread)d %(threadName)s %(message)s')
def work(barrier:threading.Barrier):
logging.info('n_waitting = {}'.format(barrier.n_waiting))
try:
bid = barrier.wait()
logging.info('after barrier {}'.format(bid))
except threading.BrokenBarrierError:
logging.info('Broken Barrier in {}'.format(threading.current_thread().name))
barrier = threading.Barrier(3) #代表3个一等,3个一等
for x in range(9):
if x == 2:
barrier.abort()
elif x == 6:
barrier.reset()
threading.Event().wait(1)
threading.Thread(target=work,name='worker-{}'.format(x),args=(barrier,)).start()
运行结果:
140222793496320 worker-0 n_waitting = 0
140222785103616 worker-1 n_waitting = 1
140222785103616 worker-1 Broken Barrier in worker-1
140222793496320 worker-0 Broken Barrier in worker-0
140222793496320 worker-2 n_waitting = 0
140222793496320 worker-2 Broken Barrier in worker-2
140222793496320 worker-3 n_waitting = 0
140222793496320 worker-3 Broken Barrier in worker-3
140222793496320 worker-4 n_waitting = 0
140222793496320 worker-4 Broken Barrier in worker-4
140222793496320 worker-5 n_waitting = 0
140222793496320 worker-5 Broken Barrier in worker-5
140222793496320 worker-6 n_waitting = 0
140222785103616 worker-7 n_waitting = 1
140222774519552 worker-8 n_waitting = 2
140222774519552 worker-8 after barrier 2
140222793496320 worker-6 after barrier 0
140222785103616 worker-7 after barrier 1
wait超时:
import threading
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s %(thread)d %(threadName)s %(message)s')
def work(barrier:threading.Barrier,i:int):
logging.info('n_waitting = {}'.format(barrier.n_waiting))
try:
logging.info(barrier.broken) #是否broken
if i < 3:
bid = barrier.wait(1) #超时后,屏障broken
else:
if i ==6:
barrier.reset() #恢复屏障
bid = barrier.wait()
logging.info('after barrier {}'.format(bid))
except threading.BrokenBarrierError:
logging.info('Broken Barrier. run.')
barrier = threading.Barrier(3) #代表3个一等,3个一等
for x in range(9):
threading.Event().wait(2)
threading.Thread(target=work,name='worker-{}'.format(x),args=(barrier,x)).start()
运行结果:
2019-07-08 11:03:16,856 140150558570240 worker-0 n_waitting = 0
2019-07-08 11:03:16,856 140150558570240 worker-0 False
2019-07-08 11:03:17,857 140150558570240 worker-0 Broken Barrier. run.
2019-07-08 11:03:18,857 140150558570240 worker-1 n_waitting = 0
2019-07-08 11:03:18,857 140150558570240 worker-1 True
2019-07-08 11:03:18,857 140150558570240 worker-1 Broken Barrier. run.
2019-07-08 11:03:20,858 140150558570240 worker-2 n_waitting = 0
2019-07-08 11:03:20,858 140150558570240 worker-2 True
2019-07-08 11:03:20,858 140150558570240 worker-2 Broken Barrier. run.
2019-07-08 11:03:22,858 140150558570240 worker-3 n_waitting = 0
2019-07-08 11:03:22,858 140150558570240 worker-3 True
2019-07-08 11:03:22,858 140150558570240 worker-3 Broken Barrier. run.
2019-07-08 11:03:24,859 140150558570240 worker-4 n_waitting = 0
2019-07-08 11:03:24,859 140150558570240 worker-4 True
2019-07-08 11:03:24,859 140150558570240 worker-4 Broken Barrier. run.
2019-07-08 11:03:26,859 140150558570240 worker-5 n_waitting = 0
2019-07-08 11:03:26,860 140150558570240 worker-5 True
2019-07-08 11:03:26,860 140150558570240 worker-5 Broken Barrier. run.
2019-07-08 11:03:28,860 140150558570240 worker-6 n_waitting = 0
2019-07-08 11:03:28,860 140150558570240 worker-6 True
2019-07-08 11:03:30,861 140150547986176 worker-7 n_waitting = 1
2019-07-08 11:03:30,861 140150547986176 worker-7 False
2019-07-08 11:03:32,861 140150539593472 worker-8 n_waitting = 2
2019-07-08 11:03:32,862 140150539593472 worker-8 False
2019-07-08 11:03:32,862 140150539593472 worker-8 after barrier 2
2019-07-08 11:03:32,862 140150558570240 worker-6 after barrier 0
2019-07-08 11:03:32,862 140150547986176 worker-7 after barrier 1