1

我正在研究一个代表空气质量站的 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()命令都会挂起,因为附加线程挂起。


我查看了很多示例和文档,包括以下内容:

任何其他资源或直接答案将不胜感激!

4

2 回答 2

1
  1. 我不熟悉您似乎在 GpsPoller 类中使用的 gps 模块,以及它是否支持对其进行轮询(检查是否存在 fileno 属性)。但是假设它没有,我能提供的最好的方法是忙等待,直到值被设置

就像是:

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 的 running 属性设置为 False 的调用。
于 2015-10-10T19:03:04.777 回答
0

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

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

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

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

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

于 2015-10-10T19:19:36.737 回答