首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过python的多处理模块进行时间旅行:我肯定做错了什么

通过python的多处理模块进行时间旅行:我肯定做错了什么
EN

Stack Overflow用户
提问于 2011-04-12 03:18:57
回答 2查看 198关注 0票数 4

我使用python进行认知科学中类似视频游戏的实验。我正在测试一种通过EOG检测眼球运动的设备,该设备通过USB与计算机通信。为了确保在实验执行其他操作(如更改显示等)时从USB连续读取数据,我认为应该使用多处理模块(当然是使用多核计算机),将USB读取工作放在一个单独的工作进程中,并使用队列告诉该工作进程在实验中发生感兴趣的事件。然而,我遇到了一些奇怪的行为,即使两个不同的消息进入worker队列之间有1秒,当我在最后查看worker的输出时,它似乎几乎是在第一个消息之后立即收到第二个消息。当然,我写错了代码,但我看不出是什么,所以我非常感谢任何人能提供的帮助。

我已经尝试将我的代码简化为演示此行为的最小示例。如果你看了这个要点:

https://gist.github.com/914070

您将找到"multiprocessing_timetravel.py“和"analysis.R",前者对示例进行编码,后者分析运行"multiprocessing_timetravel.py”后得到的"temp.txt“文件。"analysis.R“是用R编写的,需要安装plyr库,但我还在"analysis_results.txt”文件中包含了分析输出的示例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-12 07:21:29

啊,我解决了它,结果比我想象的要简单得多。每个“试验”有5个事件,最后一个事件触发向HD写入数据。如果最后一次写入花费了很长时间,则在第二个事件已经放入队列之前,工作进程可能不会抓取下一个试验的第一个事件。当这种情况发生时,第一个事件在它遇到第二个事件之前只会持续一个循环(在worker的眼睛看来)。我必须找出一种更快的方法来写出数据,或者把数据留在内存中,直到实验中的中断允许长时间写入。

票数 0
EN

Stack Overflow用户

发布于 2011-04-12 05:02:57

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

请注意,如果您的USB读取代码丢弃了GIL (例如,ctypes代码,或设计用于丢弃GIL的Python扩展模块),那么您确实获得了真正的多线程,并且线程方法可能比使用多处理更有效率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5626341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档