Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现线程最大执行时间的最佳方法是什么(在python/gtk中)?_Python_Multithreading_Timeout_Pygtk - Fatal编程技术网

实现线程最大执行时间的最佳方法是什么(在python/gtk中)?

实现线程最大执行时间的最佳方法是什么(在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

实现线程作业超时(即:在最长X秒后终止作业)的最佳实践是什么? 我编写了以下python代码。我读了很多不同的方法来实现这一点,但我有点迷茫。。。我必须用定时器来做这个吗?或者通过在
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线程。您必须拆分工作并检查工作线程中的超时,这样它才能正常终止