在python中同步多个线程

时间:2009-05-20 11:12:35

标签: python multithreading synchronize

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

您想要的功能称为“barrier”。 (不幸的是,在谈论线程时,这个术语有2个含义。所以,如果你Google它,只要忽略那些谈论“memory barriers”的文章 - 这是一个非常不同的事情。)

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

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

答案 2 :(得分:1)

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

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

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

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

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