Sign-up....

散分兼python 的 timeout

最近承大家照顾,专家分终于到了5个小角。为答谢大家,特地散分。

另出一个讨论,希望大家能够踊跃讨论。本贴200分,其中100分看此问题的回答100分散分给大家。

我们知道ruby中有一个timeout机制

require 'timeout'

status = timeout(5) {

# something time consuming tasks

}

给定的代码快,如果能在timeout设定的时间内完成,则正常返回,否则将中断这段代码,并抛出异常TimeoutError。

timeout方法我想在一些上下文中还是很有用的。现在请大家考虑下在python中如何实现这种类似的机制。

[324 byte] By [msdn] at [2007-9-26 8:20:13]
# 1 Re: 散分兼python 的 timeout

放在子线程中是不是可以。

limodou at 2004-12-30 17:26:32 >
# 2 Re: 散分兼python 的 timeout

可以看一看 http://simon.bofh.ms/cgi-bin/viewcvs.cgi/LazyEvaluation/

作者实现了一种技术性实验用的future,把函数计算放在线程中。不过,不清楚如何强行中断python的线程,或有什么好方法立刻中断线程。

limodou at 2004-12-30 17:28:41 >
# 3 Re: 散分兼python 的 timeout

设置成daemon是个停止线程的好方法。

limodou at 2005-1-1 4:22:17 >
# 4 Re: 散分兼python 的 timeout

不过这样是必须等够5秒。如果函数计算不足5秒也要等待5秒,应该改成 <= 5秒都可以返回为好。

limodou at 2005-1-1 11:38:10 >
# 5 Re: 散分兼python 的 timeout

这个把

time.sleep(self.timeout)

改成

self.subThread.join(self.timeout)

就好了

还有Timeout可以不用是Thread对象

xyzxyz1111 at 2005-1-1 12:07:02 >
# 6 Re: 散分兼python 的 timeout

我想捕获timeout很难。因为现在的处理是将函数封装起来,引发timeout是在函数之外,而不是函数里面。

limodou at 2005-1-1 12:20:29 >
# 7 Re: 散分兼python 的 timeout

这恐怕很难了,Python的线程并不是真的线程,只是用Python VM模拟的线程,而这个东西似乎是ruby语言直接支持的。我想用Python代码恐怕无法做到吧。多半要写C的扩展。

shhgs at 2005-1-2 0:57:22 >
# 8 Re: 散分兼python 的 timeout

代码怎么没有缩近呢?看起来太麻烦了。

limodou at 2005-1-2 13:27:20 >
# 9 Re: 散分兼python 的 timeout

to limodou

要看到缩进,就得用IE。没办法,我也用firefox,但是到这里贴帖子只能换IE。

我也不懂ruby,不过可以肯定,python也是继续运行下去而不是重来一遍。这段测试程序大概每隔半秒钟数一个1,我大致算了一下,后一个测试大概用了15秒。不过不要紧,你把它放到while循环里,每次运行5秒钟。如果运行1分钟还出不来,那可以肯定Python是每次重新开始,不过我虽然还没试过,但是我很有把握,Python肯定是继续的。

这也是为什么我说Python比我想的更强大的原因了。

shhgs at 2005-1-2 16:25:23 >
# 10 Re: 散分兼python 的 timeout

ruby中begin rescue end就等价于try ... except....可以如此理解

begin ... ensure... end 等价于try ... finally ...

xyzxyz1111 at 2005-1-2 22:05:56 >
# 11 Re: 散分兼python 的 timeout

如果这样说的话,那真正需要异常保护的就是begin...rescue之间的语句,把它用timeout封装不就行了。而rescue...end之间的语句放在线程之外执行就可以了。那这样的话,使用shhgs最早的实现就可以做到了。示例为:

func1 为需要保护的前半段代码

func2 为需要保护的后半段代码

可能要处理好两者的参数传递的问题。

然后:

try:

timeout(5, func1)

except

func2

这样是不是就可以了。

limodou at 2005-1-2 22:36:34 >
# 12 Re: 散分兼python 的 timeout

我认为ruby关于timeout的行为非常简单,就是设置一个定时器,到时则向一个代码块抛出异常。

数据结构是一个栈,遇到异常,如果当前栈顶能够找到异常处理方法,则由此方法处理异常;否则将弹出一层到上一层处理。所以被timeout的code block可以通过异常处理来决定自己的行为,可以继续也可以中断。

xyzxyz1111 at 2005-1-3 1:01:04 >

其他开发语言

All Classified