散分兼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]

# 2 Re: 散分兼python 的 timeout
可以看一看 http://simon.bofh.ms/cgi-bin/viewcvs.cgi/LazyEvaluation/
作者实现了一种技术性实验用的future,把函数计算放在线程中。不过,不清楚如何强行中断python的线程,或有什么好方法立刻中断线程。
# 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 ...
# 11 Re: 散分兼python 的 timeout
如果这样说的话,那真正需要异常保护的就是begin...rescue之间的语句,把它用timeout封装不就行了。而rescue...end之间的语句放在线程之外执行就可以了。那这样的话,使用shhgs最早的实现就可以做到了。示例为:
func1 为需要保护的前半段代码
func2 为需要保护的后半段代码
可能要处理好两者的参数传递的问题。
然后:
try:
timeout(5, func1)
except
func2
这样是不是就可以了。
# 12 Re: 散分兼python 的 timeout
我认为ruby关于timeout的行为非常简单,就是设置一个定时器,到时则向一个代码块抛出异常。
数据结构是一个栈,遇到异常,如果当前栈顶能够找到异常处理方法,则由此方法处理异常;否则将弹出一层到上一层处理。所以被timeout的code block可以通过异常处理来决定自己的行为,可以继续也可以中断。