使用Python

时间:2015-10-10 18:28:34

标签: python multithreading gps polling 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类初始化功能中的纬度和纵向读数的最佳方法是什么?在初始化时,我得到的纬度和纵向值为无(我怀疑GPS由于没有时间来进行卫星定位)。

  2. 确保GpsPoller与AirStation实例一起终止的标准方法是什么?每当我在命令行测试时,exit()命令都会挂起,因为其他线程会挂起。

  3. 我已经看了很多例子和文档,包括以下内容:

    非常感谢任何其他资源或直接答案!

2 个答案:

答案 0 :(得分:1)

  1. 我不熟悉您在GpsPoller类中使用的gps模块,以及它是否支持对其进行轮询(检查fileno属性是否存在)。但假设它没有,我可以提供的最佳方式是忙碌,直到设置值
  2. 类似的东西:

    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
    
    1. 确保线程与父进程一起消失的最好方法是执行已经完成的操作,并将布尔值与其主循环相关联,该主循环可以设置为False,当线程应该被设置为断开循环时终止。我假设您缺少的是当您的AirStation课程关闭时,将GpsPollers的运行属性设置为False的调用。

答案 1 :(得分:0)

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

  1. GPS模块需要足够的时间来修复卫星。没有办法加快这个过程(至少为了这个应用程序)。从我的实验看来,我使用的GPS模块在大约4-5秒内始终返回所有GPS修复。

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

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

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