实现线程最大执行时间的最佳方法是什么(在python/gtk中)?
实现线程作业超时(即:在最长X秒后终止作业)的最佳实践是什么? 我编写了以下python代码。我读了很多不同的方法来实现这一点,但我有点迷茫。。。我必须用定时器来做这个吗?或者通过在实现线程最大执行时间的最佳方法是什么(在python/gtk中)?,python,multithreading,timeout,pygtk,Python,Multithreading,Timeout,Pygtk,实现线程作业超时(即:在最长X秒后终止作业)的最佳实践是什么? 我编写了以下python代码。我读了很多不同的方法来实现这一点,但我有点迷茫。。。我必须用定时器来做这个吗?或者通过在add\u timeout回调中计数 顺便说一句,thread.join(timeout)在gtk/threaded应用程序中的使用非常有限,因为它阻塞了主线程 谢谢 注意:我对python/线程非常陌生 #/usr/bin/python 导入时间 导入线程 导入gobject 进口gtk 进口油嘴滑舌 gobjec
add\u timeout
回调中计数
顺便说一句,thread.join(timeout)
在gtk/threaded应用程序中的使用非常有限,因为它阻塞了主线程
谢谢
注意:我对python/线程非常陌生
#/usr/bin/python
导入时间
导入线程
导入gobject
进口gtk
进口油嘴滑舌
gobject.threads_init()
类myui():
定义初始化(自):
interface=gtk.Builder()
接口。从_文件(“myui.glade”)添加_
接口。连接信号(自)
self.spinner=interface.get\u对象('spinner1')
def bg_工作1(自身):
打印“工作已开始”
#模拟一些工作
时间。睡眠(5)
打印“工作已完成”
def启动(自):
线程=线程。线程(目标=self.bg_work1)
thread.start()
#工作开始了。现在,当工作完成时,我想要
#旋转的旋转器
self.spinner.start()
打印“微调器已启动”
#thread.join()#我想在旋转器旋转时等待作业完成。
#但这似乎会阻塞主线程,因此gui不会显示!
glib.timeout\u add(100,自检\u作业,线程,5)
def检查_作业(自身、线程、超时):
#打印“检查已调用的作业”
如果不是thread.isAlive():
打印“不再存在”
self.spinner.stop()
返回错误
返回真值
如果名称=“\uuuuu main\uuuuuuuu”:
app=myui()
app.startup()
打印“gtk主回路启动!”
gtk.main()
打印“gtk主循环已停止!”
您的代码看起来相当不错,唯一缺少的是使用和评估超时点:
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线程。您必须拆分工作并检查工作线程中的超时,这样它才能正常终止