总览

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

可重现的例子

让我们运行一个从0到100计数的for循环。当计数器(i)达到50时,它必须完成一个资源密集的过程(调用sampler函数,该函数对1百万个正态分布进行了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
  }
}

最佳答案

在我看来,您的 call 只是在创建工作人员时阻塞,而在实际工作期间却没有。例如。如果先执行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使用率仍然很高。

10-06 15:00