独立线程中的快速IO操作



我有一组我的程序可以通信的仪器,我想把通信放在一个单独的线程中。

IO非常慢(每个仪器每个项目约100毫秒(,我需要将它们的结果值记录在一个共享数组中(最后N个值(,并保存到一个文件中,同时尽快进行重复测量。一些仪器"制定"响应的速度较慢,因此一些读数可以同时进行,但读数需要大致同步(即每行读数1个时间戳(

我希望这一切都在一个单独的线程中完成,这样主线程中发生的计算等就不会干扰定时,但主线程应该能够访问数组。

理想情况下,我应该能够运行一些daq.start(),并且它可以在没有进一步交互的情况下运行。

做这件事的"蟒蛇式"方法是什么?我一直在读关于异步、线程和多处理的文章,但我不清楚哪一个合适。

在c++中,我将有一个启动线程1,它只将测量值顺序记录到缓存数组中。只要thread2能够获得锁,它就会将该缓存刷新到主共享数组中。同时,它会将其写入输出文件。通过跟踪正在读取的索引范围,锁定冲突将是罕见的(但重要的是,当它们发生时不会中断DAQ(

这里的正确答案是线程,这不是意见。

与硬件的通信是使用DLL中实现的驱动程序完成的,当python调用DLL时,它会丢弃GIL,因此线程可以在后台执行,而python解释器本身的开销尽可能小。

应该进行适当的同步,如果使用线程写入文件,则包括线程锁,但在写入文件时,线程会丢弃GIL,并且在python解释器上几乎没有开销。

asyncio的情况并非如此,它是为异步网络而设计的,而不是硬件。

对于实现,线程池通常是实现这一点的最复杂的方式,您只需生成与连接到的仪器数量一样多的工作者,并让他们完成工作。

由于您没有使用任何asyncio功能,因此应该使用具有apply_asyncimap_unordered的multiplecesing.threadpool,并且线程会从线程模块锁定以写入磁盘,因此如果您希望在所有线程中同步每个帧,也会遇到障碍。

最新更新