Python轮询以记录传感器数据

时间:2018-06-14 08:36:44

标签: python python-multithreading

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

我对多线程的不熟悉意味着我不确定这里的最佳实践并且正在努力找到一种合理的方法来实现这一点:我考虑过的选项是:

  1. 将数据记录作为单独的线程,等待事件。当传感器2采用新读数时,传感器2设置事件,并且记录发生
  2. 数据记录作为基于计时器的单独线程,在找到新数据时写入
  3. 传递数据记录功能作为传感器轮询功能的参数
  4. 所有这些选项都可以实施,但它们看起来有点笨拙 - 你会建议采用哪种方式来解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

写一些代码来读取object1并执行time.sleep(0.1),读取10次,做一个计数器来计算读取次数,如果计数器== 10然后去读取object2,然后将counter重置为0在True循环中全部放入。

我知道你可能会说:但它是序列对象1中的阅读 - > object2但我想在同一时间读取object1和object2。

如果是这种情况,您希望在完全相同的时间内同时读取两个传感器,例如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