![](/img/trans.png)
[英]How to manually start and stop a thread running blocking code within a Python asyncio event loop?
[英]Stop a thread running a blocking operation
我在停止正在執行阻塞操作的線程時遇到問題。 我正在編寫一個使用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修復時,在next()上阻止運行方法,這將不會自行停止...有任何想法嗎? 如果GPS已修復,則代碼工作正常。
非常感謝!
好吧,我想我做到了。 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
而且工作正常。 謝謝!
我知道它不是很優雅,但這是我到目前為止所看到的代碼,似乎可以正常工作。 以防萬一對任何人都有用。
它每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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.