我正在通过PyVisa(VISA的Python包装器)玩一些测量仪器。具体来说,我需要从四个仪器中读取测量值,类似于:
current1 = instrument1.ask("READ?")
current2 = instrument2.ask("READ?")
current3 = instrument3.ask("READ?")
current4 = instrument4.ask("READ?")
对于我的申请,速度是必须的。单独地,我可以从四个乐器每秒获得50到200次测量,但不幸的是,我目前的代码连续评估了四种乐器。
从我读过的内容来看,Python中有一些选项可以使用Threading和Multiprocessing,但对于我来说,最好和最快的选项并不明显。 最好的情况我将每秒产生~4x50个线程,所以开销是一个值得关注的问题。
任务不是CPU密集型的,只需等待仪器读出即可。
有关正确行动方案的建议吗?
非常感谢提前!
答案 0 :(得分:0)
尝试在python中使用multiprocessing模块。由于python解释器的编写方式,python的线程模块在具有多个处理器的计算机上使用多个线程时实际上会降低应用程序的速度。这是由于称为全局解释器锁(GIL)的东西,它只允许每次运行一个python线程。这使得解释器更容易进行内存管理和并发。
我建议尝试为每个工具(生产者流程)创建一个流程,并将结果发送到由单个流程(消费者流程)处理的共享队列。
我还会将您创建的进程数限制为计算机上的处理器数。创建太多进程会带来很多开销。
如果你真的觉得你需要你在帖子中建议的200个线程,我会用Java或C ++编写它。
答案 1 :(得分:0)
我不确定这是否符合您的要求我对pyVisa不太熟悉,但是你有没有看过pypy的无叠加的例子,速度提升非常令人印象深刻,而你'能够产生几乎无限量的线程'对您的系统/程序没有太大的阻碍。
pypy在支持各种套餐方面有限,但看起来pyVisa不是其中之一。