python - 在python中使用多处理运行多个进程的问题
问题描述
我的程序 audio()、motion() 和vibration() 中有 3 个函数,每个函数的定义方式是它们从各自的传感器收集数据。我编写了一个从音频和振动传感器收集数据的 python 程序和一个从运动传感器获取数据的 C 程序(它比 python 快得多)。
最初我使用多处理库中的“进程”来同时运行音频()和振动(),效果非常好。但是现在当我尝试同时运行 motion() 时,问题就出现了。问题是在 audio() 完成之前,motion() 进程不会启动,反之亦然,因为它应该实时运行,所以我需要给键盘中断以完成 audio() 或 motion()过程。
据我了解,任何一个过程(动作和音频)都会等待对方完成,然后开始执行。但我的目标是将它们一起运行,以便我可以在同一时间轴上获取数据。
def vibration():
#collects vibration data from raspberry shake
....
....
def audio():
#uses pyaudio to record audio data
....
....
def motion():
command = 'rtl_sdr -f 433000000 -g 15 -s 1024000 - | ./rf_receiver'
subprocess.run(command)
p1 = Process(target=_thread.start_new_thread(fetch_data, ("hello",)))
p1.start()
p2 = Process(target=audio())
p2.start()
p3 = Process(target=motion())
p3.start()
p1.join()
p2.join()
p3.join()
解决方案
你的问题是你从你的主进程调用你的工作函数,并且只将它们的返回值作为target
参数传递给Process
. 您可能想要类似p2 = Process(target=audio)
(没有()
after audio
)和p3 = Process(target=motion)
. 您可能还想要类似的东西p1
,但我不知道您当前的代码对那里的线程做了什么,所以我不能轻易修复它。
推荐阅读
- networking - NS2跟踪文件中AGT级别的重要性
- java - 如何排除已经验证的链接验证?
- haskell - 如何正确更新 Data.IORef 中保存的 Haskell 记录?
- java - JdbcTemplate BeanPropertyRowMapper 的问题 - 将 int & double 字段设置为 0 而不是实际值
- java - java检查数据类型ArrayList
- java - 使用带有连接字符分隔符的收集器
- wordpress - 移动菜单打开时删除汉堡菜单切换
- angular - 仅使用下一个省略错误并在 Angular observable 中完成是否有意义?
- java - 在 Java 中解析 CACM 集合
- unity3d - Unet Non-Player 非服务器健康同步