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

使用Python在单独线程中进行GPSd轮询,python,multithreading,gps,polling,gpsd,Python,Multithreading,Gps,Polling,Gpsd,我正在开发一个python类,它表示一个空气质量站。每个空气质量监测站都有一个与之相关的全球定位系统,以便我们能够识别监测站的纬度和纵向坐标。GpsPoller在单独的线程上调用,并持续运行,直到线程终止。应使用GpsPoller在任何给定时间获取最新的GPS数据 以下是我迄今为止所做的工作: class AirStation: def __init__(self): if not self._init_station(): raise Init

我正在开发一个python类,它表示一个空气质量站。每个空气质量监测站都有一个与之相关的全球定位系统,以便我们能够识别监测站的纬度和纵向坐标。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类初始化功能中的横向和纵向读数的最佳方法是什么?在初始化时,我得到的纬度和纵向值均为零(我怀疑由于时间不够,GPS必须进行卫星定位)

  • 确保GpsPoller与AirStation实例一起终止的标准方法是什么?每当我在命令行中测试这个时,
    exit()
    命令就会挂起,因为附加的线程会挂起


  • 我看了不少示例和文档,包括以下内容:

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

  • 我不熟悉您在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
    
  • 确保线程与父进程一起消亡的最佳方法是执行您已经完成的操作,并将布尔值与其主循环相关联(可以设置为False),在线程应该终止时中断循环。我认为您缺少的是在AirStation类关闭时将GpsPollers的running属性设置为False的调用

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

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

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

  • 确保GpsPoller线程终止的最佳方法是通过在父进程中设置self.\u gpsp.running=False,然后等待线程使用self.\u gpsp.join()与父线程进行连接,从而终止循环条件

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

  • 啊哈!对#2的简单修复。谢谢你的反馈!