使用Python在单独线程中进行GPSd轮询



我正在编写一个代表空气质量站的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()

关于这段代码,我有两个问题:
  1. 在AirStation类的初始化函数中,确保纵向和纬度读数的最佳方法是什么?在初始化时,我得到的纬度和纵向值为None(我怀疑由于缺乏时间,GPS必须获得卫星修复)。

  2. 确保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

任何额外的资源或直接的答案将不胜感激!

  1. 我不熟悉你似乎在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。

我相信我已经找到了上面问题的最佳解决方案。以下是我的想法:

  1. GPS模块需要足够的时间来获得卫星定位。没有办法加速这个过程(至少对于这个应用程序而言)。从我的实验来看,我使用的GPS模块似乎在大约4-5秒内始终返回所有GPS修复。

    要回答我的第一个问题,确保在初始化AirStation对象时获得纬度和纵向坐标的最佳方法是在启动GpsPoller后等待几秒钟。

  2. 确保GpsPoller线程被终止的最好方法是通过在父进程中设置self._gpsp.running = False来终止循环条件,然后使用self._gpsp.join()等待该线程与父线程重新连接。

    这些操作可以放入close()方法中,该方法应在站对象生命周期结束时调用。

相关内容

  • 没有找到相关文章

最新更新