【问题标题】:Stop a thread running a blocking operation停止运行阻塞操作的线程
【发布时间】:2013-07-05 19:13:28
【问题描述】:

我在停止执行阻塞操作的线程时遇到问题。我正在编写一个使用 gpsd 并且它是 python 绑定的程序,Thread 的 run 方法如下所示:

def run(self):
    print "inside run. outside while"
    global gpsd
    while self.running:
        print "inside while"
        try:
            print "before next()"
            gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer
            print "after next()"
            self.file_descriptor.write(str(int(time.time())) + ',' + str(gpsd.fix.latitude) + ',' + str(gpsd.fix.longitude) + ',' + str(gpsd.fix.altitude) + ',' + str(gpsd.fix.speed) + '\n')
            print "after write"
            #self.file_descriptor.write("self.running" + str(self.running) + '\n')
            self.file_descriptor.flush()
            print "after flush"
            time.sleep(5)
            print "after sleep"
        except:
            print "inside thread except"
            raise

问题是 next() 方法是阻塞的,所以即使我从我的主线程调用:

    print "Stopping GPS thread"
    gpsp.running = False
    gpsp.join() # wait for the thread to finish what it's doing

当没有 GPS 修复时,run 方法在 next() 上被阻止,不会自行停止......有什么想法吗?如果 GPS 已修复,则代码工作正常。

非常感谢!

【问题讨论】:

    标签: python gps python-multithreading gpsd


    【解决方案1】:

    好吧,我想我做到了。 gps 库有一个非阻塞的方法来检查数据是否可用,所以现在它看起来像:

    def run(self):
        global gpsd
        while self.running:
            try:
                if gpsd.waiting(): #only True if data is available
                    gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer
    
                self.file_descriptor.write(str(int(time.time())) + ',' + str(gpsd.fix.latitude) + ',' + str(gpsd.fix.longitude) + ',' + str(gpsd.fix.altitude) + ',' + str(gpsd.fix.speed) + '\n')
                self.file_descriptor.flush()
                time.sleep(5)
            except:
                raise
    

    而且它工作正常。谢谢!

    【讨论】:

    • 非常感谢。我想在 tkinter 中使用 gpsd utc 时间与系统时间(python 的日期时间)相比,我真的想保持系统时间以毫秒为单位。我不想弄清楚如何使用 Python 线程,因为我是 Python 的新手(而且我通常很少使用线程),这真的救了我。如果可以的话 +1000。
    【解决方案2】:

    我知道这不是很优雅,但这是我到目前为止所编写的代码,并且似乎工作正常。以防万一对任何人都有用。

    它每 5 秒从 gpsd 读取 GPS 位置并将其写入文件。

    while self.running:
                    try:
                        if gpsd.waiting():
                            #print "inside waiting()"
                            while gpsd.waiting():
                                gpsd.next()          
    
                            self.file_descriptor.write(str(int(time.time())) + ',' 
                                                       + str(gpsd.fix.latitude) + ',' 
                                                       + str(gpsd.fix.longitude) + ',' 
                                                       + str(gpsd.fix.altitude) + ',' 
                                                       + str(gpsd.fix.speed) + '\n')
                            self.clear_fix()                
                        else:                    
                            self.file_descriptor.write(str(int(time.time())) + ",NO_GPS_FIX\n")
    
                        self.file_descriptor.flush()
                        time.sleep(5)
                    except:
                        print "Exception on run()inside thread"
                        raise
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多