我正在编写一个代表空气质量站的python类。每个空气质量监测站都有一个与之相关的GPS,这样我们就可以确定该站的纬度和纵向坐标。GpsPoller在单独的线程上调用,并持续运行,直到线程终止。GpsPoller应该用于在任何给定时间获得最新的GPS数据。
到目前为止我所做的是:
class AirStation:
def __init__(self):
if not self._init_station():
raise InitException("Could not initialize the AirStation!")
def _init_station(self):
self._id = utils.get_mac('wlan0')
self._gpsp = utils.GpsPoller()
self._gpsp.start() # start polling the GPS sensor
self._lat = self._gpsp.get_gps_data()
self._lon = self._gpsp.get_gps_data()
return True
class GpsPoller(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.session = gps(mode=WATCH_ENABLE)
self.current_value = None
self.running = True
def get_gps_data(self):
return self.current_value
def run(self):
while self.running:
self.current_value = self.session.next()
关于这段代码,我有两个问题:
在AirStation类的初始化函数中,确保纵向和纬度读数的最佳方法是什么?在初始化时,我得到的纬度和纵向值为None(我怀疑由于缺乏时间,GPS必须获得卫星修复)。
确保GpsPoller与AirStation实例一起终止的标准方法是什么?每当我在命令行测试时,
exit()
命令都会挂起,因为附加线程挂起了。
我已经看了很多例子和文档,包括以下内容:
- https://docs.python.org/2/library/threading.html线程对象
- http://www.danmandle.com/blog/getting-gpsd-to-work-with-python/
- https://stackoverflow.com/a/6146351/3342427
任何额外的资源或直接的答案将不胜感激!
- 我不熟悉你似乎在GpsPoller类中使用的gps模块,以及它是否支持对它进行轮询(检查是否存在一个文件属性)。然而,假设它没有,我能提供的最好的方法是忙等待,直到值设置
类似:
while True:
if self._lat is None:
self._lat = self._gpsp.get_gps_data()
elif self._lon is None:
self._lon = self._gpsp.get_gps_data()
else:
break
- 确保线程与父进程一起死亡的最好方法是做你已经做过的事情,并将一个布尔值与它的主循环关联,该循环可以设置为False,在线程应该终止时中断循环。我认为你缺少的是一个调用,当你的AirStation类关闭时,将GpsPollers的运行属性设置为False。
我相信我已经找到了上面问题的最佳解决方案。以下是我的想法:
-
GPS模块需要足够的时间来获得卫星定位。没有办法加速这个过程(至少对于这个应用程序而言)。从我的实验来看,我使用的GPS模块似乎在大约4-5秒内始终返回所有GPS修复。
要回答我的第一个问题,确保在初始化AirStation对象时获得纬度和纵向坐标的最佳方法是在启动GpsPoller后等待几秒钟。
-
确保GpsPoller线程被终止的最好方法是通过在父进程中设置self._gpsp.running = False来终止循环条件,然后使用self._gpsp.join()等待该线程与父线程重新连接。
这些操作可以放入close()方法中,该方法应在站对象生命周期结束时调用。