从Python中的一个线程读取值:队列或全局变量?
问题描述:
我有一个线程,每10ms测量一个电压值(从外部设备捕获),应用一些初级低通滤波并将该值存储在变量lp_voltage
中。主程序每隔几秒需要读取存储在lp_voltage
中的值。从Python中的一个线程读取值:队列或全局变量?
我想通了两种方法可能做到这一点与threading
框架:
-
Sharing the global variable
lp_voltage
between the thread and the main program,使用线程的global
关键字。这不利于使用全局变量,即often considered bad practice。 -
Using the Queue module,看起来更多pythonic。但是我不知道如何适应我的问题:主程序只需要不时地访问
lp_voltage
的瞬时值,而不是全部的数据队列。
什么样的选择最好?如果队列更好,如何使它们适应我的问题?
答
如果您知道自己在做什么,那么第一种方法是可以的。
更多的解释:
在这两种方法中,你需要确保你的两个线程可以访问共享变量(lp_voltage
或v_queue
)。真正的优势v_queue
具有一致性。如果你不关心一致性,你可以简单地使用一个变量。
要实现这个更pythonic,你可以把你的整个项目包装成一个object
。例如:
class VoltageTask:
def __init__(self):
self.lp_voltage = 0
self.thread = Thread(target=self.update_voltage)
def update_voltage(self):
self.lp_voltage = your_function_to_get_voltage()
def main_thread(self):
...
def start(self):
self.thread.start()
self.main_thread()
if __name__ == "__main__":
task = VoltageTask()
task.start()
我结束了使用像你提议的解决方案,它工作得很好。唯一的区别是,将主代码从类中取出,而是读取'task'对象的'lp_voltage'属性。 –