2013-04-16 32 views
0

实现线程作业超时的最好的习惯做法是什么(即:在最多X秒后终止作业)? 我写了下面的python代码。我读了很多不同的方式来实现这一点,但我有点失落......我必须用计时器来做到这一点吗?或者通过计数在add_timeout回调?实现线程最大执行时间的最佳方式是什么(在python/gtk中)?

作为一个附注,在gtk/threaded应用程序中使用thread.join(timeout)相当有限,因为它会阻塞主线程?

谢谢!

注:我很新的Python /线程

#!/usr/bin/python 

import time 
import threading 
import gobject 
import gtk 
import glib 
gobject.threads_init() 


class myui(): 
    def __init__(self): 
     interface = gtk.Builder() 
     interface.add_from_file("myui.glade") 
     interface.connect_signals(self) 

     self.spinner = interface.get_object('spinner1')   

    def bg_work1(self): 
     print "work has started" 
     # simulates some work 
     time.sleep(5) 
     print "work has finished" 

    def startup(self): 
     thread = threading.Thread(target=self.bg_work1) 
     thread.start() 

     # work started. Now while the work is being done I want 
     # a spinner to rotate 
     self.spinner.start() 
     print "spinner started" 

     #thread.join() # I wanna wait for the job to be finished while the spinner spins. 
            # but this seems to block the main thread, and so the gui doesn't shows up ! 

     glib.timeout_add(100, self.check_job, thread, 5) 

    def check_job(self, thread, timeout): 
     #print 'check job called' 

     if not thread.isAlive(): 
       print 'is not alive anymore' 
       self.spinner.stop() 
       return False 
     return True 


if __name__ == "__main__": 

    app = myui() 
    app.startup() 

    print "gtk main loop starting !" 

    gtk.main() 
    print "gtk main loop has stopped !" 

回答

0

你的代码看起来不错,唯一缺少的是使用和评估超时点:

glib.timeout_add(100, self.check_job, thread, time.time() + 5) 

def check_job(self, thread, timeout): 
    #print 'check job called' 

    if not thread.isAlive(): 
      print 'is not alive anymore' 
      self.spinner.stop() 
      return False 
    if time.time() > timeout: 
      print 'job timed out' 
      self.spinner.stop() 
      return False 
    return True 

然而,这不会在超时后终止你的工作线程,所以它仍然会运行。我没有意识到强制终止Python线程的方法。你将不得不拆分你的工作,并检查工作线程中的超时,以便它可以正常终止。

相关问题