我正在编写一些代码,我从Web API下载了许多页面,进行了一些处理,并将它们组合成一个数据框。 API需要大约30秒来响应每个请求,因此在对当前页面进行处理时发送下一页的请求会很方便。我可以使用例如mcparallel
这样做,但这似乎有点矫枉过正。 curl
包声称它可以进行非阻塞连接,但这对我来说似乎不起作用。
来自vignette("intro", "curl")
:
从版本2.3开始,也可以打开连接 非阻塞模式。在这种情况下,readBin和readLines将返回 立即获得可用而无需等待的数据。对于 我们使用的非阻塞连接isIncomplete来检查是否下载 已经完成了。
con <- curl("https://httpbin.org/drip?duration=1&numbytes=50") open(con, "rb", blocking = FALSE) while(isIncomplete(con)){ buf <- readBin(con, raw(), 1024) if(length(buf)) cat("received: ", rawToChar(buf), "\n") } close(con)
预期的结果是open
应立即返回,然后在结果出来时,应在1秒内逐步打印50个星号。对我来说,open
阻塞大约一秒,然后一次打印出星号。
我还需要做些什么吗?这对其他人有用吗?
我在Ubuntu 16.04 LTS上使用R版本3.3.2,curl包版本3.1和libcurl3版本7.47.0。我已经在RStudio和命令行R控制台上尝试过,结果相同。