【发布时间】:2020-06-20 15:09:35
【问题描述】:
我使用的代码会在给定时间内中断命令的执行,以免达到(crunchbase)API-Limit。
managed_call <- function(f, events = 44L, every = 60L) {
force(f)
minute_ <- rep(NA, events)
function(...) {
m_dif <- as.numeric(Sys.time() - minute_, units = "secs")
minute_[!is.na(m_dif) & m_dif > every] <<- NA
calls_remaining <- sum(is.na(minute_))
if (!calls_remaining) {
message("Close to API limit, pausing for ",
round(every - max(m_dif), 3), " seconds")
Sys.sleep(every - max(m_dif))
minute_[which.max(m_dif)] <- NA
minute_[Position(is.na, minute_)] <<- Sys.time()
f(...)
} else {
minute_[Position(is.na, minute_)] <<- Sys.time()
f(...)
}
}
}
当应用正常的 apply 或 lapply 命令时,这种代码和平会给我以下警告:
Updated <- function(x){is.null(crunchbase_GET(x))}
> abc <- unlist(lapply(websites,Updated))
Close to API limit, pausing for 1.25 seconds
Close to API limit, pausing for 1.119 seconds
...
但是,我尝试了使用 makeCluster 和 parSapply 的另一个选项:
library("parallel")
abc<- logical(100)
Updated <- function(x){is.null(crunchbase_GET(x))}
cl <- makeCluster(detectCores(), type = "PSOCK")
clusterExport(cl, varlist = "websites")
clusterEvalQ(cl = cl, library(rcrunchbase))
abc <- parSapply(cl = cl, X = websites, FUN = Updated, USE.NAMES = FALSE)
警告消息现在不会出现。因此,我想知道是否执行了实际的 Sys.sleep() 命令,如果没有,是否有可能让我的代码使用 parSapply 运行。
非常抱歉,我无法提供可以针对这种特定情况复制的良好示例,因为需要 user_key 才能使用 rCrunchbase 并因此检索有关 API 限制等信息。
【问题讨论】:
标签: r parallel-processing apply