Обзор
Я пишу программу (на R), которая выполняет вызовы API в определенное время. Вызовы API занимают некоторое время, но мне нужно, чтобы таймер (основной цикл) продолжал считать, пока выполняется вызов API. Для этого мне нужно «передать» вызов API другому потоку ЦП. Я считаю, что это возможно и изучил пакеты future
и promises
, но пока не нашел решения.
Воспроизводимый пример
Давайте запустим цикл for
, который насчитывает от 0 до 100. Когда счетчик (i
) достигает 50, он должен завершить ресурсоемкий процесс (вызывая функцию sampler
, которая выбирает 1 миллион нормальные распределения 10000 раз ради занимаемого вычислительного пространства). Желание, чтобы счетчик продолжал считать, пока 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
}
}