加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

通过python的多处理模块显然是时间旅行:当然我做错了什么

发布时间:2020-12-20 13:22:49 所属栏目:Python 来源:网络整理
导读:我在认知科学中使用 python进行类似视频游戏的实验.我正在测试一种通过 EOG检测眼球运动的设备,该设备通过USB与计算机通信.为了确保在实验做其他事情(比如更换显示器等)的同时从USB连续读取数据,我想我会使用多处理模块(当然使用多核计算机),将USB读取工作放
我在认知科学中使用 python进行类似视频游戏的实验.我正在测试一种通过 EOG检测眼球运动的设备,该设备通过USB与计算机通信.为了确保在实验做其他事情(比如更换显示器等)的同时从USB连续读取数据,我想我会使用多处理模块(当然使用多核计算机),将USB读取工作放入一个单独的工作进程,并使用队列告诉该工作人员何时在实验中发生感兴趣的事件.然而,我遇到了一些奇怪的行为,即使在向工作人员发送2条不同的消息之间有1秒的时间,当我看到工作人员的输出结束时,它似乎几乎立即收到了第二个.第一.当然我编写了一些错误的东西,但我看不清楚,所以我非常感谢任何人都可以提供的帮助.

我试图将我的代码删除到一个演示此行为的最小示例.如果你去看这个要点:

https://gist.github.com/914070

您将找到代码示例的“multiprocessing_timetravel.py”和“analysis.R”,它分析运行“multiprocessing_timetravel.py”产生的“temp.txt”文件. “analysis.R”是用R编写的,要求你安装了plyr库,但我还在gist的“analysis_results.txt”文件中包含了分析输出的例子.

解决方法

尽管使用多处理,您的队列仍然使用同步对象(两个锁和一个信号量),put方法产生另一个线程(基于2.7源).因此,BlueRaja建议GIL争用(和其他有趣的东西)可能会发挥作用.您可以尝试使用 sys.checkinterval进行播放,看看降低它是否也会降低观察到的差异,尽管您不希望在该条件下正常运行.

请注意,如果您的USB读取代码丢弃GIL(例如ctypes代码或设计用于删除GIL的Python扩展模块),则会获得真正的多线程,并且线程方法可能比使用多处理更高效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读