Python 进程内部的多处理同步

Python Multiprocessing Synchronization Inside Processes

我正在尝试使用 Python 3.9.2 中的多处理库同时 运行 两个进程。我需要两个进程之间的同步,这样一旦进程启动,进程内部就需要同步。我已经编写了示例代码来解释我的目标:

from multiprocessing import Process

import time

def process_one():
    time.sleep(5)
    # ---- WAIT FOR PROCESS TWO TO CATCH UP
    # --- SYNCHRONIZE HERE
    print(time.time())

def process_two():
    time.sleep(10)
    # --- SYNCHRONIZE HERE
    print(time.time())

def main():
    first = Process(target=process_one).start()
    second = Process(target=process_two).start()

    first.join()
    second.join()

    print('Both completed at: ', time.time())

if __name__ == '__main__':
    main()

例如,我理解process_one()process_two()同时开始。但是,在这些进程内部,我需要两者之间的同步,以便两个进程中打印的 time.time() 相等(以表明两个进程内部存在同步)。

我搜索了整个文档,最后我只使用了 synchronizer = Barrier(2),将 synchronizer 作为参数传递给我的每个过程函数,然后包括行 synchronizer.wait()在两个进程函数中,我希望同步匹配。我已经使用我自己的代码对此进行了测试,该代码需要同时从外部 DAQ 设备读取并从串行端口读取。串行端口初始化需要 2 秒,所以我需要 DAQ 设备读取等待 2 秒但不是硬编码 time.sleep(2)synchronizer.wait() 方法无效。

有解决办法吗?

使用 Barrier 实例似乎工作正常。但是,您对 firstsecond 的分配确实存在问题:start 方法 returns None 以及随后对 [=17 的调用=] 会失败。

from multiprocessing import Process, Barrier

import time

def process_one(barrier):
    time.sleep(5)
    # ---- WAIT FOR PROCESS TWO TO CATCH UP
    # --- SYNCHRONIZE HERE
    barrier.wait()
    print(time.time())

def process_two(barrier):
    time.sleep(10)
    # --- SYNCHRONIZE HERE
    barrier.wait()
    print(time.time())

def main():
    barrier = Barrier(2)
    first = Process(target=process_one, args=(barrier,))
    second = Process(target=process_two, args=(barrier,))
    first.start()
    second.start()

    first.join()
    second.join()

    print('Both completed at: ', time.time())

if __name__ == '__main__':
    main()

打印:

1626008280.0219996
1626008280.0219996
Both completed at:  1626008280.0350006