gpt4 book ai didi

r - setTimeLimit 无法终止 R 中的空闲调用

转载 作者:行者123 更新时间:2023-12-02 02:46:45 28 4
gpt4 key购买 nike

我想使用 setTimeLimit 来中止 n 秒后陷入等待(空闲)的操作。下面是一个玩具示例,其中 Sys.sleep 是一个空闲的占位符调用:

testlimit <- function(){
setTimeLimit(elapsed=3, transient=TRUE);
Sys.sleep(10);
}

system.time(testlimit());

然而,这给出了不一致的结果。在 Windows 和 r-studio 服务器 (linux) 上,调用在 3 秒后正确中止 win video 。但是,当我在 linux 的终端 session 中运行此命令时或osx ,直到 Sys.sleep() 之后才会触发超时,并且整个脚本需要 10 秒才能完成。

造成这种差异的原因是什么?我可以在终端 R session 中设置一些内容来触发时间限制吗?我使用的是 Ubuntu 13.04 amd64、R 版本 3.0.1 RC 和 osx 10.8

最佳答案

问题是answered by Simon Urbanek在 r-devel 邮件列表上。以下是他的回复副本,以供将来引用:

What causes this difference?

时间限制只能在 R_ProcessEvents() 中检查,因此出于所有实际目的,它只能由调用 R_CheckUserInterrupt() 的可中断代码触发。现在,完全由前端决定事件循环的方式。例如,R 的终端版本除了异步触发的输入处理程序之外没有其他中断需要担心,因此它不需要进行任何轮询。 Sys.sleep() 仅在输入处理程序上触发,因此如果您没有任何外部事件源 Hook 作为输入处理程序,则没有理由处理任何事件,因此 Sys.sleep() 不会有任何理由检查时间限制。

Is there something I can set in my terminal R session such that the time limit is triggered?

在 OS X 上这实际上非常简单:quartz(); dev.off() 就可以了。原因是 Quartz 需要强制事件循环才能异步处理来自窗口的事件。它通过安装基于计时器的输入处理程序来实现这一点。该处理程序将确保 Sys.sleep() 每 100 毫秒唤醒一次(您可以使用 QuartzCocoa_SetLatency 更改该值),因此它将在该分辨率下超时:

> testlimit <- function(){
+ setTimeLimit(elapsed=3, transient=TRUE);
+ Sys.sleep(10);
+ }
> system.time(testlimit());
Error in Sys.sleep(10) : reached elapsed time limit
Timing stopped at: 0 0.001 10.001
> quartz(); dev.off()
null device
1
> testlimit <- function(){
+ setTimeLimit(elapsed=3, transient=TRUE);
+ Sys.sleep(10);
+ }
> system.time(testlimit());
Error in Sys.sleep(10) : reached elapsed time limit
Timing stopped at: 0.002 0.003 3.019

在 Linux 上,没有内置计时器,因此您必须添加一个输入处理程序来抢占 Sys.sleep()。如果你想要一个恒定的计时器,你可以简单地借用 Quartz 的代码(看看 src/library/grDevices/src/qdCocoa.m 中的 QuartzCocoa_SetupEventLoop)或 CarbonEL 包。它实际上只是一个作为输入处理程序添加的管道,当您想要唤醒事件循环时,您可以异步写入该管道。目前我无法想到 R 中的内置解决方案(尽管可能有人认为,当设置限制时,R 可能会自行安装处理程序......)。

但请注意,这实际上只是 Sys.sleep() 的一个特例。如果您实际运行 R 代码,则在评估期间(或在可中断的 C 代码中)会自动触发 ProcessEvents。

干杯,西蒙

关于r - setTimeLimit 无法终止 R 中的空闲调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576595/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com