R 中的异步编程
Asynchronous programming in R
概览
我正在编写一个程序(在 R 中),它在特定的指定时间进行 API 调用。 API 调用需要一段时间,但我需要计时器(主循环)在进行 API 调用时继续计数。为此,我需要 "outsource" API 调用另一个 CPU 线程。我相信这是可能的,并且已经研究了 future
和 promises
包,但还没有找到解决方案。
可重现的例子
让我们运行一个从 0 到 100 计数的 for
循环。当计数器 (i
) 达到 50 时,它必须完成一个资源密集型过程(调用函数sampler
,为了占用计算量space),它对 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
}
}
在我看来,您的调用仅在创建工作人员时才阻塞,但在实际工作期间不会阻塞。例如。如果先执行 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 使用率仍然很高。
概览
我正在编写一个程序(在 R 中),它在特定的指定时间进行 API 调用。 API 调用需要一段时间,但我需要计时器(主循环)在进行 API 调用时继续计数。为此,我需要 "outsource" API 调用另一个 CPU 线程。我相信这是可能的,并且已经研究了 future
和 promises
包,但还没有找到解决方案。
可重现的例子
让我们运行一个从 0 到 100 计数的 for
循环。当计数器 (i
) 达到 50 时,它必须完成一个资源密集型过程(调用函数sampler
,为了占用计算量space),它对 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
}
}
在我看来,您的调用仅在创建工作人员时才阻塞,但在实际工作期间不会阻塞。例如。如果先执行 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 使用率仍然很高。