进程内的Python多进程同步

2024-05-17 01:02:44 发布

您现在位置: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()相等(以表明两个进程中存在同步)

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

有解决办法吗


Tags: 代码importsynchronizeheretime进程maindef
1条回答
网友
1楼 · 发布于 2024-05-17 01:02:44

使用Barrier实例似乎效果不错。但是,您对firstsecond的赋值确实存在问题: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

相关问题 更多 >