停止运行阻塞操作的线程

Ign*_*ona 3 python gps gpsd python-multithreading

我在停止正在执行阻塞操作的线程时遇到问题。我正在编写一个使用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
Run Code Online (Sandbox Code Playgroud)

问题是next()方法正在阻塞,因此即使从我的主线程调用:

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

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

非常感谢!

Ign*_*ona 5

好吧,我想我做到了。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
Run Code Online (Sandbox Code Playgroud)

而且工作正常。谢谢!