首页 > 解决方案 > 进程内的 Python 多处理同步

问题描述

我正在尝试使用 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()两个进程中的打印是相等的(以表明两个进程内部存在同步)。

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

有针对这个的解决方法吗?

标签: pythonpython-3.xmultithreadingmultiprocessingsynchronization

解决方案


使用Barrier实例似乎工作正常。但是,您对firstand的分配确实存在问题second:该start方法返回None,因此您随后的调用join将失败。

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

推荐阅读