Barrier là kỹ thuật đồng bộ hóa: nhiều thread chờ tại một điểm chung (barrier point) cho đến khi đủ số lượng thread quy định, sau đó cùng được giải phóng để tiếp tục thực thi.
Khởi tạo Barrier
import threading b = threading.Barrier(parties, action=None, timeout=None)
- parties: Số thread cần đạt đến barrier
- action: Callable được gọi bởi một thread khi barrier được giải phóng
- timeout: Timeout mặc định cho
wait()
Thuộc tính và phương thức
| parties | Số thread yêu cầu (read-only) |
| n_waiting | Số thread đang chờ |
| broken | True nếu barrier bị phá vỡ |
| wait(timeout=None) | Chờ đến khi đủ parties hoặc timeout. Trả về index (0 đến parties-1) |
| reset() | Đặt lại trạng thái ban đầu. Thread đang chờ nhận BrokenBarrierError |
| abort() | Đưa barrier vào trạng thái broken. Tất cả wait().fail với BrokenBarrierError |
Ví dụ: Cuộc đua barrier
from random import randrange
from threading import Barrier, Thread
from time import ctime, sleep
num = 4 # 4 thread cần đạt barrier
b = Barrier(num)
names = ['India', 'Japan', 'USA', 'China']
def player():
name = names.pop()
sleep(randrange(2, 5))
print('%s reached the barrier at: %s \n' % (name, ctime()))
b.wait()
threads = []
print("Race starts now...")
for i in range(num):
threads.append(Thread(target=player))
threads[-1].start()
# Đợi tất cả thread hoàn thành
for thread in threads:
thread.join()
print("All Reached Barrier Point!")
Kết quả mẫu
Race starts now... India reached the barrier at: Fri Jan 18 14:07:44 2019 China reached the barrier at: Fri Jan 18 14:07:44 2019 Japan reached the barrier at: Fri Jan 18 14:07:46 2019 USA reached the barrier at: Fri Jan 18 14:07:46 2019 All Reached Barrier Point!
Ứng dụng thực tế
- Đồng bộ khởi tạo: Đợi tất cả service sẵn sàng trước khi bắt đầu
- Map-Reduce: Đợi phase map hoàn tất trước khi reduce
- Game multiplayer: Đợi đủ người chơi trước khi bắt đầu trận đấu
- Pipeline xử lý: Đồng bộ các stage xử lý song song