3

概述

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

可重现的例子

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

1 回答 1

3

在我看来,你的电话只是在创建工人时被阻塞,而不是在实际工作期间。例如,如果做第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 使用率仍然很高。

于 2019-07-01T08:27:47.583 回答