假设我有一个 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
- 也就是说,启动一个计时器到一个回调设置(或取消设置)您的执行代码知道的一些全局变量 - 以便在检测时,它可以尝试退出。