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
实例似乎工作正常。但是,您对 first
和 second
的分配确实存在问题: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
我正在尝试使用 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
实例似乎工作正常。但是,您对 first
和 second
的分配确实存在问题: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