手动API速率限制

时间:2015-02-27 16:57:05

标签: r github rate-limiting

我正在尝试为rgithub包编写手动速率限制功能。到目前为止,这就是我所拥有的:

library(rgithub)

pull <- function(i){
 commits <- get.pull.request.commits(owner = owner, repo = repo, id = i, ctx = get.github.context(), per_page=100)
 links <- digest_header_links(commits)
 number_of_pages <- links[2,]$page
 if (number_of_pages != 0)
   try_default(for (n in 1:number_of_pages){
    if (as.integer(commits$headers$`x-ratelimit-remaining`) < 5)
     Sys.sleep(as.integer(commits$headers$`x-ratelimit-reset`)-as.POSIXct(Sys.time()) %>% as.integer())
  else
    get.pull.request.commits(owner = owner, repo = repo, id = i, ctx = get.github.context(), per_page=100, page = n)
}, default = NULL)
else 
   return(commits)
}

list <- c(500, 501, 502)

pull_lists <- lapply(list, pull)

意图是如果x-ratelimit-remaining变量低于某个阈值,脚本应该等到x-ratelimit-reset中指定的时间过去,然后继续脚本。但是,我不确定这是否是我在这里if else设置的实际行为。

该函数运行正常,但我对它是否实际进行速率限制或是否以某种方式跳过该步骤存在疑问。因此我问:a)我怎样才能知道它是否实际上是速率限制的,b)如果没有,我怎样才能重写它以便它实际上进行速率限制? while条件/循环可能更好吗?

2 个答案:

答案 0 :(得分:1)

您可以测试速率限制是否将5更改为足够大的数字,并使用以下内容添加Sys.sleep时间的显示:

print(system.time(Sys.sleep(...)))

那说,这个功能对我来说似乎没问题,遗憾的是我无法轻易测试,因为rgithub不适用于我的R版本(3.1.3)。

答案 1 :(得分:0)

不是规范的答案,而是一些有效的例子 您应该在脚本中添加一些日志记录,甚至是write.csv(append=TRUE)

我已实施自动 antiddos 流程,可防止您的IP被交易所市场禁止。你可以找到它jangorecki/Rbitcoin/R/utils.R Rbitcoin.last_api_call是存储在包命名空间中的env对象,类会话包缓存 这可以帮助您在包中进行设置。

您还应该考虑一个可选的 parallel 支持的版本。使用并发读取链接到数据库。我的函数可以很容易地修改为每隔X秒排队调用和重新检查时间。

修改
我忘了添加提到的功能支持多个源系统。这允许例如扩展你的rgithub for bitbucket等,并且仍然有效地管理API速率限制。