繁体   English   中英

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

[英]GPSd Polling in Separate Thread with Python

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


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

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

  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的调用。

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

  1. GPS模块需要足够的时间来获取卫星定位。 无法加快此过程的速度(至少出于本应用程序的考虑)。 从我的实验看来,我正在使用的GPS模块始终在大约4-5秒内返回所有GPS定位。

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

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

    可以将这些操作放入close()方法中,该方法应在station对象的寿命结束时调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM