Python论坛  - 讨论区

标题:Fwd: [python-chinese] 有没有好的 方法强制结束一 个?叱蹋? size=100 maxlength=80 style=

2005年04月21日 星期四 17:05

limodou limodou at gmail.com
Thu Apr 21 17:05:28 HKT 2005

---------- Forwarded message ----------
From: limodou <limodou at gmail.com>
Date: 2005-4-21 下午5:04
Subject: Re: [python-chinese] 有没有好的 方法强制结束一  个?叱蹋? size=100 maxlength=80 style=
To: Qiangning Hong <hongqn at gmail.com>


如果在执行timeout之前没有别的deamon的线程的话,这个方法其实还是可以的。

那有没有可能在执行timeout之前先全部把deamon线程改为非deamon,然后超时后再改回来。不过的确不是一个好方法。

在05-4-21,Qiangning Hong<hongqn at gmail.com> 写道:
> 拜读了一下,没有缩进真是让人很头疼。用vmware的win2k+ie也不行。
>
>  shhgs说:
>
> >
> 如果你对线程比较熟悉,这个问题应该是一点就通的,如果不熟悉,那就比较麻烦了。Python的文档根本帮不了你,那是给已经很熟悉线程的人准备的。不过不管是哪种语言,线程基本上大同小异,你可以找本书看看。
> >
>
> >
> 这里关键就是把真正调用程序的线程设成daemon的,然后当主线程,也就是控制时间同时又调用函数的那个线程sleep足时间退出之后,daemon线程自然就中止了。
> >
>
>  其实用setDaemon不能从根本上解决timeout的问题,我觉得是shhgs本人没有仔细看python的文档。
> python的文档上说:The entire Python program exits when no active non-daemon
> threads are left.
> 意思是说python进程在所有非daemon线程结束后退出。daemon线程的中止是由于python进程的结束,而非调用其的线程(父线程)结束。在python主线程退出之前,daemon线程还是在一直跑着的。
>
> 我把shhgs的例子稍微改了一下,可以看得更明白些。在function里增加了输出,可以看到线程是否在运行;把两次测试颠倒一下次序,先测试超时的,再测试不超时的。
>
>  import threading, time
>  import sys
>
>  TimeoutError = ""
>
>  def function(args = [], kwargs = {}) :
>      z = 1
>      if len(args) != 0 :
>          n = args[0]
>      else :
>          n = 10
>      indicator = kwargs.get('indicator', '.')
>      while z < n :
>          z += 1
>          time.sleep(0.5)
>          sys.stdout.write(indicator)
>          sys.stdout.flush()
>      return z
>
>  class FuncWrapper(object) :
>      def __init__(self, func, args, kwargs) :
>          self.func = func
>          self.args = args
>          self.kwargs = kwargs
>          self.hasReturn = False
>
>      def execute(self) :
>          self.result = self.func(self.args, self.kwargs)
>          self.hasReturn = True
>
>  class Timeout(threading.Thread) :
>      def __init__(self, timeout, func) :
>          threading.Thread.__init__(self)
>          self.timeout = timeout
>          self.func = func
>          self.subThread = threading.Thread(target = self.func.execute)
>          self.subThread.setDaemon(True)
>
>      def run(self) :
>          self.subThread.start()
>          time.sleep(self.timeout)
>          if not self.func.hasReturn :
>              raise "TimeoutError"
>
>
>  if __name__ == "__main__" :
>      funcobj = FuncWrapper(function, [1000,], {})
>      try :
>          t = Timeout(5, funcobj)
>          t.run()
>          print funcobj.result
>      except :
>          print "Not completed in given time!"
>
>      funcobj = FuncWrapper(function, [5, ], {'indicator': '*'})
>      try :
>          t = Timeout(5, funcobj)
>          t.run()
>          print funcobj.result
>      except :
>          print "Not completed in given time!"
>
>
>  运行结果如下:
>
>  hongqn at gentoo tmp $ python test.py
>  ..........Not completed in given time!
>  .*.*.*.*......5
>
>  可以看出,虽然第一次测试已经输出超时信息,但这个function还是在继续运行的(用"."表示)。
>
> 倒是xyzxyz1111的提议靠些谱,启一个定时器,到时间通过PyThreadState_SetAsyncExc给工作线程发一个exception。
>
> Ruby的线程机制是在语言基础上实现的,Python的线程是在操作系统上层包装的。但不管是哪一个,都不可能强行中断C调用,至少也要等到调用返回才
> 能进入语言层次。因此对于贴主询问的驱动API调用超时问题,python线程恐怕无能为力,而要从操作系统考虑,用杀死进程或杀死操作系统线程(不是
> python线程)的方法来实现。杀死进程相对容易实现一些,而在python中通过OS
> API直接操作线程,还请有经验的人来讲讲。
>
>
>
>
> On 4/21/05, limodou <limodou at gmail.com> wrote:
> > 看这个贴子:
> >
> >
> http://community.csdn.net/Expert/TopicView3.asp?id=3688365
> >
> > 在05-4-21,Qiangning Hong<hongqn at gmail.com > 写道:
> > > API不让你timeout出来,你就没有办法timeout出来……
> > >  你可以试着另起一个进程包含此API操作,然后时间到了就kill process。
> > >
> > >
> > > On 4/21/05, kanchy kang <zzhikang at hotmail.com> wrote:
> > > >
> > > > csdn上我查了一下,好象没有找到,在其它论坛上,似乎有个timeout处理,但是是在unix平台上
> > > > 而我现在是windows平台。
> > > > 另外,就是不知道怎样让访问驱动的API timeout 出来。。。
> > > >
> > > > >From: limodou < limodou at gmail.com>
> > > > >Reply-To: limodou < limodou at gmail.com>,
> python-chinese at lists.python.cn
> > > > >To: python-chinese at lists.python.cn
> > > > >Subject: Re: [python-chinese] 有没有好的 方法强制结束一个?叱蹋?>Date: Wed,
> > > > >20 Apr 2005 12:53:45 +0800
> > > > >
> > > > >在csdn以前讨论过这个问题,你可以去找一找。关于 timeout的实现。
> > > > >
> > > > >在05-4-20,kanchy kang< zzhikang at hotmail.com> 写道:
> > > > > > 我有一个程序,它创建一个线程来调用一个任务,
> > > > > > 该任务中,有一个访问驱动的函数,
> > > > > > 比如执行一个访问驱动的操作,
> > > > > > A = Func(....)//这个函数不能拆解进去
> > > > > > 现在有可能这个访问操作死掉了(没有返回),线程就一直等待在哪儿,
> > > > > > 我需要,设定一个时间,比如10秒,超过了就强行终止程序,。
> > > > > > 或者,干脆,创建一个按钮,在需要时结束该运行线程,
> > > > > >
> > > > > > 请问有方法实现吗?
> > > > > >
> > > > > > >From: limodou <limodou at gmail.com >
> > > > > > >Reply-To: limodou < limodou at gmail.com>,
> > > python-chinese at lists.python.cn
> > > > > > >To: python-chinese at lists.python.cn
> > > > > > >Subject: Re: [python-chinese] 请教各位一 个Text加颜色的问题
> > > > > > >Date: Tue, 19 Apr 2005 17:28:40 +0800
> > > > > > >
> > > > > > >如果使用StyledTextCtrl就要仔细研究文档了,说起来比较复杂。 NewEdit 中
> > > > > > >有实现,许多基于wxPython的编辑器都有实现。
> > > > > > >
> > > > > > >在05-4-19,kanchy kang< zzhikang at hotmail.com> 写道:
> > > > > > > >
> > > > > >
> > > > > >我查看了一下,但是并没有发现自定义关键值得颜色,我举例"---〉"等,并非就一定是这个关键字。。。
> > > > > > > >
> > > > > > > >
> > >
> _________________________________________________________________
> > > > > > > > Don抰 just search. Find. Check out the new MSN Search!
> > > > > > > >
> > >
> http://search.msn.click-url.com/go/onm00200636ave/direct/01/
> > > > > > > >
> > > > > > > >
> _______________________________________________
> > > > > > > > python-chinese list
> > > > > > > > python-chinese at lists.python.cn
> > > > > > > >
> http://python.cn/mailman/listinfo/python-chinese
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >--
> > > > > > >I like python!
> > > > > > >My Donews Blog: http://www.donews.net/limodou
> > > > > > >My Sina Blog:
> > > http://blog.sina.com.cn/blog/1148608914
> > > > > > >New Google Maillist:
> > > http://groups-beta.google.com/group/python-cn
> > > > > > >_______________________________________________
> > > > > > >python-chinese list
> > > > > > >python-chinese at lists.python.cn
> > > > > > >
> http://python.cn/mailman/listinfo/python-chinese
> > > > > >
> > > > > > -----------------------------------------------
> > > > > > Best regards,
> > > > > > kangzz
> > > > > >
> > > > > > mailto: zzhikang at hotmail.com
> > > > > > Tel : 021-65407754
> > > > > > MP: 13916928084
> > > > > >
> > > > > >
> > >
> _________________________________________________________________
> > > > > > Express yourself instantly with MSN Messenger! Download today -
> it's
> > > > >FREE!
> > > > > >
> > >
> http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
> > > > > >
> > > > > > _______________________________________________
> > > > > > python-chinese list
> > > > > > python-chinese at lists.python.cn
> > > > > > http://python.cn/mailman/listinfo/python-chinese
> > > > > >
> > > > >
> > > > >
> > > > >--
> > > > >I like python!
> > > > >My Donews Blog: http://www.donews.net/limodou
> > > > >My Sina Blog:
> http://blog.sina.com.cn/blog/1148608914
> > > > >New Google Maillist:
> > > http://groups-beta.google.com/group/python-cn
> > > > >_______________________________________________
> > > > >python-chinese list
> > > > >python-chinese at lists.python.cn
> > > > > http://python.cn/mailman/listinfo/python-chinese
> > > >
> > > > -----------------------------------------------
> > > > Best regards,
> > > > kangzz
> > > >
> > > > mailto: zzhikang at hotmail.com
> > > > Tel : 021-65407754
> > > > MP: 13916928084
> > > >
> > > >
> > >
> _________________________________________________________________
> > > > Is your PC infected? Get a FREE online computer virus scan from
> McAfee�
> > > > Security.
> > >
> http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963
> > > >
> > > > _______________________________________________
> > > > python-chinese list
> > > > python-chinese at lists.python.cn
> > > > http://python.cn/mailman/listinfo/python-chinese
> > > >
> > >
> > >
> > >
> > > --
> > > Qiangning Hong
> > > Get Firefox! <
> > >
> http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
> > >
> > > _______________________________________________
> > > python-chinese list
> > > python-chinese at lists.python.cn
> > > http://python.cn/mailman/listinfo/python-chinese
> > >
> > >
> > >
> >
> > --
> > I like python!
> > My Donews Blog: http://www.donews.net/limodou
> > My Sina Blog: http://blog.sina.com.cn/blog/1148608914
> > New Google Maillist:
> http://groups-beta.google.com/group/python-cn
> >
>
>
>
> --
> Qiangning Hong
> Get Firefox!
> <http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1
> >
>

--
I like python!
My Donews Blog: http://www.donews.net/limodou
My Sina Blog: http://blog.sina.com.cn/blog/1148608914
New Google Maillist: http://groups-beta.google.com/group/python-cn


-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou
My Sina Blog: http://blog.sina.com.cn/blog/1148608914
New Google Maillist: http://groups-beta.google.com/group/python-cn

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年04月21日 星期四 17:17

Qiangning Hong hongqn at gmail.com
Thu Apr 21 17:17:09 HKT 2005

On 4/21/05, limodou <limodou at gmail.com> wrote:
> 
> 如果在执行timeout之前没有别的deamon的线程的话,这个方法其实还是可以的。


也不行。除非你一timeout就退出程序,daemon线程才会实现到超时时停止工作的功能,否则这个线程就要一直跑下去。要不就是用 
xyzxyz1111的方法在超时时从外部给线程发一个异常,或者通过设置flag变量的方法,在工作线程中不停查询该变量的值,来使工作线程终止。不过 
这样的话,工作线程是不是daemon的就无关紧要了。

那有没有可能在执行timeout之前先全部把deamon线程改为非deamon,然后超时后再改回来。不过的确不是一个好方法。


setDaemon必须在调用start之前调用,不能在线程运行后设置。 


-- 
Qiangning Hong
Get Firefox! <
http://www.spreadfirefox.com/?q=affiliates&id=67907&t=1>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050421/817c0982/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年04月21日 星期四 19:45

kanchy kang zzhikang at hotmail.com
Thu Apr 21 19:45:29 HKT 2005

ÔÚÎҵijÌÐòÀÎÒÆô¶¯Ò»¸öÏß³ÌÀ´ÔËÐÐÒ»¸öÈÎÎñ£¬
ÎÒÐèÒªÉèÖÃÖжϸÃÈÎÎñµÄ¹¦ÄÜ£¬ÓÚÊÇÎҾͣº
    def thread_run(self,cases,f):
        r = 
Runtest(self.config,cases,self.runStatusCallBack,self.runBtnCallBack,f)
        r.setDaemon(True)
        r.start()
        while r.isAlive():
            if self.terminate:
                self.terminate = False
                break
            time.sleep(2)
    def RunCase(self,cases,btn):
        self.thread_run(self,cases,f):
ÓÚÊÇ£¬ÎÒµÄÏë·¨ÊÇ£¬Èç¹ûÏëÖÕÖ¹¸ÃỊ̈߳¬¾Í°Ñself.terminate == True¡£
ÏÖÔÚµÄÎÊÌâÊÇ£¬Í¨¹ýÕâÖÖ·½Ê½ÖжÏrỊ̈߳¬rÏß³ÌÀï»áÅ׳öһЩÒì³££¬
¶øÕâЩÒì³££¬ÎÒûÓа취ץµ½¡£
ÇëÎÊ£¬Óкõķ½·¨Â𣿣¨ÄÜץסÒì³£Ò²¿ÉÒÔ£©

лл¡£

_________________________________________________________________
Don’t just search. Find. Check out the new MSN Search! 
http://search.msn.click-url.com/go/onm00200636ave/direct/01/


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号