6

我有一个问题,我需要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
4

3 回答 3

2

您想要的功能称为“障碍”。(不幸的是,在谈论线程时,该术语有 2 个含义。因此,如果您在Google上搜索它,请忽略那些谈论“内存障碍”的文章——这是完全不同的事情)。

您的代码看起来很合理 - 它简单且安全。

我找不到任何 Python 障碍的“标准”实现,所以我建议你继续使用你的代码。

于 2009-05-20T11:40:53.163 回答
2

有很多方法可以同步线程。许多。

除了同步之外,您还可以执行以下操作。

  1. 围绕同步点将您的任务分成两个步骤。启动执行预同步步骤的线程。然后使用“join”等待所有线程完成第 1 步。启动新线程执行同步后步骤。我更喜欢这个,而不是同步。

  2. 创建队列;获取同步锁。启动所有线程。每个线程在队列中放入一个条目并等待同步锁。“主”线程位于从队列中取出项目的循环中。当所有线程都将一个项目放入队列时,“主”线程释放同步锁。所有其他线程现在都可以再次自由运行。

有许多进程间通信 (IPC) 技术——所有这些技术都可用于线程同步。

于 2009-05-20T12:05:05.050 回答
2

请注意,Barrier 自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()
于 2014-08-29T00:17:02.700 回答