[英]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()
关于此代码,我有两个问题/疑问:
在AirStation类的初始化功能中确保横向和纵向读数的最佳方法是什么? 初始化时,我得到的经度和纵向值均为None(我怀疑由于时间太短,GPS必须获得卫星定位)。
确保GpsPoller与AirStation实例一起终止的标准方法是什么? 每当我在命令行上对此进行测试时, exit()
命令都会挂起,因为其他线程会挂起。
我看了很多示例和文档,包括以下内容:
任何其他资源或直接答案将不胜感激!
就像是:
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
我相信我已经找到了我上面发布的问题的最佳解决方案。 这是我的想法:
GPS模块需要足够的时间来获取卫星定位。 无法加快此过程的速度(至少出于本应用程序的考虑)。 从我的实验看来,我正在使用的GPS模块始终在大约4-5秒内返回所有GPS定位。
要回答我的第一个问题,确保在AirStation对象的初始化中获得经纬度坐标的最佳方法是在启动GpsPoller之后仅等待几秒钟。
确保GpsPoller线程终止的最佳方法是通过在父进程中设置self._gpsp.running = False来终止循环条件,然后等待使用self._gpsp.join将该线程与父线程重新连接起来()。
可以将这些操作放入close()方法中,该方法应在station对象的寿命结束时调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.