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

时间:2011-04-11 19:18:57

标签: python r multiprocessing

我在认知科学中使用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”文件中包含了分析输出的例子。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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