我有一个AppleScript脚本,它运行一个递归函数来计算插入插件的实例。 在插入的每个插件之后,该函数检查CPU并确定是否存在CPU过载。
如果发现CPU过载,它会开始删除插件,直到达到令人满意的程度。 然后它返回计算机上加载的实例数。
问题是我在运行一定量后会出现堆栈溢出。 AppleScript是否有内部递归线程的限制?
on plugin_recurse(mode, plugin_name, component, track_count, instance_count, has_ref, min_instances, last_max)
try
log "mode - " & mode
if mode is "ret" then return {track_count, instance_count, last_max}
if mode is "add" then
if (instance_count - (10 * track_count) = 0) then
create_track(component)
set track_count to track_count + 1
end if
set instance_count to instance_count + 1
insert_plugin(plugin_name, component, track_count, instance_count)
if has_ref then
set CPUover to false
if min_instances = 1 then
set mode to "ret"
else
set min_instances to min_instances - 1
end if
else
set {CPUover, last_max} to check_cpu(last_max)
end if
if CPUover then
set mode to "sub"
end if
end if
if mode is "sub" then
if instance_count > 1 then
remove_plugin(plugin_name, component, track_count, instance_count)
set instance_count to instance_count - 1
if ((10 * track_count) - instance_count = 10) then
remove_track(track_count)
set track_count to track_count - 1
end if
set {CPUover, last_max} to check_cpu(last_max)
if not CPUover then
set mode to "ret"
end if
else
set mode to "ret"
end if
end if
plugin_recurse(mode, plugin_name, component, track_count, instance_count, has_ref, min_instances, last_max)
on error err
error err
end try
end plugin_recurse
答案 0 :(得分:0)
问题是我在一定数量的情况下得到了堆栈溢出 运行。 AppleScript是否有内部递归线程的限制?
是的,AppleScript仅限于许多边界。您的错误是由处理程序(函数)调用的深度限制引起的。在我的机器上,级别限制设置为577.这种限制在OOP语言中非常常见,因为运行代码的“虚拟机”需要它的限制。例如,Objective-C在递归方面也有局限性。如果您需要更多,您的代码被认为是错误的编码,您应该尝试使用正常循环。但是,我必须承认,与其他OOP的限制相比,577并不是一个非常高的数字。
对于这样的代码,如果不确定会有多少递归,通常使用循环比递归更好。