python - 进程内的 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()
方法不起作用。
有针对这个的解决方法吗?
解决方案
使用Barrier
实例似乎工作正常。但是,您对first
and的分配确实存在问题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
推荐阅读
- reed-solomon - reed-solomon 纠错扩展 Euclid 算法
- python - 无法在 cx_oracle 中“设置定义关闭”;
- python - 在 POpen 子进程中启动脚本并不断获取它们的输出
- javascript - JavaScript / Node.js / Express.js : HTTP Route Filtering for Completion Status from Data Object --> 测试规范
- jquery - 使用带有下方按钮的 $(this) 获取表中最后一行的值
- c# - 获取与 linq 的多对多关系的总和列表
- rust - 为什么即使我已将变量移入闭包,我仍能调用两次闭包?
- php - 显示 CPT 的每个分类的最新帖子
- google-cloud-platform - 403错误:使用python从谷歌计算引擎上传到谷歌云存储桶
- powershell - 如何根据 PowerShell 中收到的第一个文件来选择文件?