用于记录传感器数据的 Python 轮询



我正在编写一个python脚本,该脚本使用线程轮询两个传感器,该脚本将这些传感器的数据记录到csv日志文件中。 每个传感器以不同的速率记录数据(传感器 1:1 个样本/秒;传感器 2:10 个样本/秒( - 并通过线程实现。线。 理想情况下,每次传感器 2 进行新读数时,来自两个传感器的数据都将记录到日志文件中 - 或对此的任何变化。

我对多线程的不熟悉意味着我不确定这里的最佳实践,并努力寻找一种明智的方法来实现这一点:我考虑的选项是:

  1. 将数据记录作为单独的线程,等待事件。 当传感器 2 获取新读数时,传感器 2 设置事件,并发生日志记录
  2. 数据
  3. 记录作为基于计时器的独立线程,在找到新数据时写入
  4. 将数据记录函数作为传感器轮询函数的参数传递

所有这些选项都可以实现,但它们似乎都有点笨拙 - 你建议最pythonic的方法是什么?

如果要定期读取两个输入,则无需执行线程处理。

编写一些代码来读取 object1 并执行 time.sleep(0.1(,读取 10 次,执行计数器以计算读取次数,如果计数器 == 10,则也读取对象 2,然后将计数器重置为 0。在 True 循环时将其全部放入。

我知道你可能会说:但它是按顺序读取对象 1 ->对象 2,但我想同时读取对象 1 和对象 2。

如果在这种情况下,您想在同一时间内读取两个传感器,并且例如 0.00001s 的差异对您有意义,那么请使用多处理/多线程,但请尝试了解 Python 是如何做到的,因为我听到了各种意见,您无法使用 Python 实现真正的多线程,但我并不完全确定为什么。是因为Python会强制其内部字节码编译器在CPU线程上执行一条指令吗?我不知道。我不确定。

因此,如果是这种情况,那么您可以尝试以下操作:

from multiprocessing import Process
import time
def f(name):
while True:
print(time.time())
print('read sensor 1', name)
time.sleep(1)
def d(name):
while True:
print(time.time())
print('read sensor 2', name)
time.sleep(5)
if __name__ == '__main__':
p1 = Process(target=f, args=('sensor1',))
p2 = Process(target=d, args=('sensor2',))
p1.start()
p2.start()
p1.join()
p2.join()

但请注意时间:

1528966987.5038514
read sensor 1 sensor1
1528966987.5468514
read sensor 2 sensor2
1528966988.5038514
read sensor 1 sensor1
1528966989.5038514
read sensor 1 sensor1
1528966990.5038514
read sensor 1 sensor1
1528966991.5038514
read sensor 1 sensor1
1528966992.5038514
read sensor 1 sensor1
1528966992.5468514
read sensor 2 sensor2
1528966993.5038514
read sensor 1 sensor1
1528966994.5038514
read sensor 1 sensor1
Process finished with exit code 1

有一个很小的差异(0.043(:

1528966992.5038514
read sensor 1 sensor1
1528966992.5468514
read sensor 2 sensor2

最新更新