R 中的异步编程



概述

我正在编写一个程序(在R中),该程序在某些指定时间进行API调用。API 调用需要一段时间,但我需要计时器(主循环)在进行 API 调用时继续计数。为此,我需要将 API 调用"外包"到另一个 CPU 线程。我相信这是可能的,并且已经研究了futurepromises包,但尚未找到解决方案。

可重现的示例

让我们运行一个从 0 到 100 计数的for循环。当计数器(i)达到50时,它必须完成一个资源密集型过程(调用函数sampler,为了占用计算空间,它对10,000次正态分布进行10,000次采样)。希望计数器在另一个线程上工作时继续计数sampler()

#Something to take up computation space
sampler <- function(){
for(s in 1:10000) sample(1000000)
}
#Get this counter to continue while sampler() runs on another thread
for(i in 1:100){
message(i)
if(i == 50){
sampler()
}
}

我尝试过什么(不成功)

library(future)
sampler <- function(){
for(s in 1:10000) sample(1000000)
}
for(i in 1:100){
message(i)
if(i == 50){
mySamples <- future({ sampler() }) %plan% multiprocess
}
}

在我看来,您的调用仅在创建工人时阻塞,而不是在实际工作期间阻止。 例如,如果先执行plan(),计数器将不会阻止:

library(future)
sampler <- function(){
for(s in 1:10000) sample(1000000)
}
plan(multiprocess)
for(i in 1:100){
message(i)
if(i == 50){
mySamples <- future({ sampler() })
}
}

另请注意,sampler()的运行时间比代码中阻塞调用的持续时间长得多,并且在执行代码后,mySamples仍然具有状态resolved: FALSE并且 CPU 使用率仍然很高。

相关内容

  • 没有找到相关文章

最新更新