代码之家  ›  专栏  ›  技术社区  ›  histelheim

手动API速率限制

  •  4
  • histelheim  · 技术社区  · 10 年前

    我正在尝试为 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 回复  |  直到 10 年前
        1
  •  1
  •   cmbarbu    10 年前

    你可以测试它是否改变了速率限制 5 到足够大的数字,并添加 Sys.sleep 使用:

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

    也就是说,这个功能对我来说似乎还可以,但不幸的是,我无法轻易测试它,因为rgitub不适用于我的R版本(3.1.3)。

        2
  •  0
  •   jangorecki    10 年前

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

    我已经实现了自动 反兴奋剂 防止您的ip被交易所市场禁止的过程。你可以找到它 jangorecki/Rbitcoin/R/utils.R .
    Rbitcoin.last_api_call 是存储在包名称空间中的env对象,这是一种会话包缓存。
    这可以帮助您在包中设置它。

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

    编辑
    我忘记添加上面提到的函数支持多个 源系统 例如,这允许扩展您的rgithub for bitbucket等,并仍然有效地管理API速率限制。