【发布时间】:2014-11-11 16:22:03
【问题描述】:
我有一个硬件传感器。我需要连续读取传感器并对前 3 秒的读数进行一些数学运算。 (我读得越快,样本越多,结果就越好,所以我想不断地调用我的函数。)我需要在请求时向用户(通过网络调用)提供当前结果。结果可能会在亚秒级的基础上发生显着变化。用户可以尽可能快地或非常不频繁地请求更新。
我目前有以下代码,它可以工作。
from threading import Thread
from MySensorReadAndMath import MySensorReadAndMath
class ManageSensor(Thread):
def __init__(self):
Thread.__init__(self)
self.result={}
self.mySensorReadAndMath = MySensorReadAndMath()
def updateResult(self):
result = {}
result['value1'] = self.mySensorReadAndMath.value1
result['value2'] = self.mySensorReadAndMath.value2
return result
def getResult(self):
return self.result
def run(self):
while True:
self.mySensorReadAndMath.update()
self.result = self.updateResult()
在单独的一段代码中,我创建了类,使用 Flask 创建对 ManageSensor.getResult() 的 Web 调用以返回结果,然后启动线程。
这是线程安全的吗? (我可以得到当前的 value1 和之前的 value2,还是损坏的 self.result?)如果它不是线程安全的,怎么会我让它线程安全而不阻塞?
我考虑的具体事项:
- 首先将值复制到 updateResults() 中的本地 result 是否有任何好处(与直接将所有内容直接放入 self.result in updateResult()
- 如果我在更新 self.result 时加了锁,那么我的 run() 循环或我的 getResult() 可能会阻止我这样做不想。
- 如果我将结果推送到 run() 中的队列并在 getResult() 中弹出,我将遇到队列大小问题,因为我永远不会调用getResult() 与 self.mySensorReadAndMath.update() 运行一样快。
- 我是不是想多了? :)
【问题讨论】:
标签: python multithreading