假设我有一个 tcl 脚本,它通常应该在不到一分钟的时间内执行 - 我如何确保脚本的执行时间永远不会超过"x"分钟/秒,如果是这样,那么脚本应该停止。
例如,如果脚本花费了100 秒以上,那么我应该能够自动将控制切换到清理函数,该函数将优雅地结束脚本,以便我到目前为止运行脚本中的所有数据,但我也确保它不会花费太长时间或无限卡住。
我不确定这是否可以在 tcl 中完成 - 欢迎任何帮助或指针。
当您使用儿童口译员时,您可以使用interp limit
。
请注意,这将引发一个不可缓存的错误,如果要进行一些清理,则可以删除父 interp 中的限制。
set interp [interp create]
# initialize the interp
interp eval $interp {
source somestuff.tcl
}
# Add the limit. From now you have 60 seconds or an error will be thrown
interp limit $interp time -seconds [clock seconds] -milliseconds 60000
set errorcode [catch {interp eval {DoExpensiveStuff}} res opts]
# remove the limit so you can cleanup the mess if needed.
interp limit $interp time -seconds {}
if {$errorcode} {
# Do some cleanup here
}
# delete the interp, or reuse it?
interp delete $interp
# And what shall be done with the error? Throw it.
return -options $opt $res
资源限制是Tcl的最佳选择,但它们不是防弹的。Tcl不能(也不会)中止C过程,有一些方法可以让Tcl核心做一些艰苦的工作。
一定有一个你担心可能需要超过 100 秒的循环,是吗?在进入循环之前保存clock seconds
(当前时间),并在每次迭代结束时再次检查时间,以查看是否超过 100 秒。
如果由于某种原因这是不可能的,你可以尝试使用 after
设计一些东西——也就是说,启动一个计时器到一个回调,该回调设置(或取消设置)你的执行代码知道的某个全局变量——以便在检测到时,它可以尝试退出。