我有一个问题,我需要x
个线程等待它们都到达同步点。我的解决方案使用下面的synchronise
方法,当需要同步时,每个线程函数都会调用该方法。
有更好的方法吗?
thread_count = 0
semaphore = threading.Semaphore()
event = threading.Event()
def synchronise(count):
""" All calls to this method will block until the last (count) call is made """
with semaphore:
thread_count += 1
if thread_count == count:
event.set()
event.wait()
def threaded_function():
# Do something
# Block until 4 threads have reached this point
synchronise(4)
# Continue doing something else
答案 0 :(得分:2)
您想要的功能称为“barrier”。 (不幸的是,在谈论线程时,这个术语有2个含义。所以,如果你Google它,只要忽略那些谈论“memory barriers”的文章 - 这是一个非常不同的事情。)
您的代码看起来非常合理 - 它简单而且安全。
我找不到Python的任何“标准”障碍实现,所以我建议你继续使用你的代码。
答案 1 :(得分:2)
请注意,屏障已经实施as of Python 3.2
使用障碍的例子:
from threading import Barrier, Thread
def get_votes(site):
ballots = conduct_election(site)
all_polls_closed.wait() # do not count until all polls are closed
totals = summarize(ballots)
publish(site, totals)
all_polls_closed = Barrier(len(sites))
for site in sites:
Thread(target=get_votes, args=(site,)).start()
答案 2 :(得分:1)
有许多方法可以同步线程。许多。
除了同步之外,您还可以执行以下操作。
围绕同步点将您的任务分成两个步骤。启动执行预同步步骤的线程。然后使用“join”等待所有线程完成步骤1.开始执行后同步步骤的新线程。我更喜欢这个,过度同步。
创建一个队列;获取同步锁。启动所有线程。每个线程在队列中放入一个条目并等待同步锁定。 “主”线程位于循环中,从队列中取出项目。当所有线程都将一个项目放入队列时,“main”线程释放同步锁。所有其他线程现在可以再次自由运行。
有许多进程间通信(IPC)技术 - 所有这些技术都可用于线程同步。