Python 屏障
最后修改日期:2024 年 7 月 15 日
在本文中,我们将展示如何使用 threading.Barrier
同步 Python 线程。
Barrier
是一种同步原语,它允许固定数量的线程等待彼此到达一个公共的屏障点。 它对于协调多个线程以分阶段执行任务非常有用。
Barrier
初始化时需要一个计数,表示在所有线程可以继续之前必须到达屏障的线程数。 每个线程都调用屏障上的 wait
方法,该方法会阻塞,直到所有线程都到达屏障。 一旦所有线程都到达,它们将被释放,并且可以重复使用该屏障。
屏障示例
以下示例演示如何使用 threading.Barrier
同步多个线程。
import threading import time def worker(barrier, thread_name): print(f"{thread_name} is starting") time.sleep(2) # Simulate some work print(f"{thread_name} is waiting at the barrier") barrier.wait() # Wait for all threads to reach the barrier print(f"{thread_name} is continuing after the barrier") def main(): num_threads = 3 barrier = threading.Barrier(num_threads) threads = [] for i in range(num_threads): # Create 3 threads thread = threading.Thread(target=worker, args=(barrier, f"Thread-{i+1}")) threads.append(thread) thread.start() for thread in threads: thread.join() # Wait for all threads to complete print("All threads completed") if __name__ == "__main__": main()
在此程序中,使用 Barrier
来同步三个线程。 每个线程执行一些工作,在屏障处等待,然后在所有线程都到达屏障后继续。
barrier = threading.Barrier(num_threads)
Barrier
使用必须到达屏障的线程数进行初始化,之后所有线程才能继续。
barrier.wait() # Wait for all threads to reach the barrier
每个线程都调用屏障上的 wait
方法,该方法会阻塞,直到所有线程都到达屏障。
for thread in threads: thread.join() # Wait for all threads to complete
主线程使用 join
方法等待所有工作线程完成。
$ python main.py Thread-1 is starting Thread-2 is starting Thread-3 is starting Thread-1 is waiting at the barrier Thread-2 is waiting at the barrier Thread-3 is waiting at the barrier Thread-1 is continuing after the barrier Thread-2 is continuing after the barrier Thread-3 is continuing after the barrier All threads completed
带有 Action 的屏障
以下示例演示如何使用带有 action 的 Barrier
。 一旦所有线程都到达屏障,就会执行该 action。
import threading import time def worker(barrier, thread_name): print(f"{thread_name} is starting") time.sleep(2) # Simulate some work print(f"{thread_name} is waiting at the barrier") barrier.wait() # Wait for all threads to reach the barrier print(f"{thread_name} is continuing after the barrier") def barrier_action(): print("All threads have reached the barrier") def main(): num_threads = 3 barrier = threading.Barrier(num_threads, action=barrier_action) threads = [] for i in range(num_threads): # Create 3 threads thread = threading.Thread(target=worker, args=(barrier, f"Thread-{i+1}")) threads.append(thread) thread.start() for thread in threads: thread.join() # Wait for all threads to complete print("All threads completed") if __name__ == "__main__": main()
在此程序中,Barrier
使用一个 action 进行初始化,该 action 一旦所有线程都到达屏障,就会执行。
barrier = threading.Barrier(num_threads, action=barrier_action)
Barrier
使用一个 action 进行初始化,该 action 一旦所有线程都到达屏障,就会执行。
def barrier_action(): print("All threads have reached the barrier")
该 action 是一个函数,一旦所有线程都到达屏障,就会执行该函数。
$ python main.py Thread-1 is starting Thread-2 is starting Thread-3 is starting Thread-1 is waiting at the barrier Thread-2 is waiting at the barrier Thread-3 is waiting at the barrier All threads have reached the barrier Thread-1 is continuing after the barrier Thread-2 is continuing after the barrier Thread-3 is continuing after the barrier All threads completed
使用屏障的多阶段任务示例
以下示例演示如何使用 threading.Barrier
在多个执行阶段同步线程。 每个阶段代表一个不同的工作阶段,并且屏障确保所有线程在进入下一个阶段之前完成一个阶段。
import threading import time def worker(barrier, thread_name, num_phases): for phase in range(num_phases): print(f"{thread_name} is working on phase {phase + 1}") time.sleep(1) # Simulate work for the phase print(f"{thread_name} has completed phase {phase + 1}") barrier.wait() # Wait for all threads to complete the phase print(f"{thread_name} is moving to the next phase") def main(): num_threads = 3 num_phases = 3 # Number of phases in the task barrier = threading.Barrier(num_threads) threads = [] for i in range(num_threads): # Create 3 threads thread = threading.Thread(target=worker, args=(barrier, f"Thread-{i+1}", num_phases)) threads.append(thread) thread.start() for thread in threads: thread.join() # Wait for all threads to complete print("All phases completed by all threads") if __name__ == "__main__": main()
在此程序中,使用 Barrier
在三个执行阶段同步三个线程。 每个线程在一个阶段工作,等待所有线程完成该阶段,然后进入下一个阶段。
barrier = threading.Barrier(num_threads)
Barrier
使用必须到达屏障的线程数进行初始化,之后所有线程才能进入下一个阶段。
barrier.wait() # Wait for all threads to complete the phase
每个线程在完成一个阶段后都调用屏障上的 wait
方法。 这确保所有线程在进入下一个阶段之前完成当前阶段。
for thread in threads: thread.join() # Wait for all threads to complete
主线程使用 join
方法等待所有工作线程完成。
$ python main.py Thread-1 is working on phase 1 Thread-2 is working on phase 1 Thread-3 is working on phase 1 Thread-1 has completed phase 1 Thread-2 has completed phase 1 Thread-3 has completed phase 1 Thread-1 is moving to the next phase Thread-2 is moving to the next phase Thread-3 is moving to the next phase Thread-1 is working on phase 2 Thread-2 is working on phase 2 Thread-3 is working on phase 2 Thread-1 has completed phase 2 Thread-2 has completed phase 2 Thread-3 has completed phase 2 Thread-1 is moving to the next phase Thread-2 is moving to the next phase Thread-3 is moving to the next phase Thread-1 is working on phase 3 Thread-2 is working on phase 3 Thread-3 is working on phase 3 Thread-1 has completed phase 3 Thread-2 has completed phase 3 Thread-3 has completed phase 3 Thread-1 is moving to the next phase Thread-2 is moving to the next phase Thread-3 is moving to the next phase All phases completed by all threads
来源
在本文中,我们展示了如何使用 Barrier 同步 Python 线程以进行线程协调。
作者
列出所有 Python 教程。