复制示例: 在R终端上:
A B C
06/01/2015 20 97 279
05/29/2015 21 96 276
这将返回。
现在不要关闭R提示。
现在打开正常命令终端并执行:
library(rvest)
k<-html("http://materialresourcing.com/tags/diy")
你会发现它有一个处于CLOSE_WAIT状态的TCP句柄,永远。 (即直到R会议结束)
并且rvest API似乎没有控制强制关闭连接。
有什么想法?谢谢!
更新:
实际上只是在做:
lsof | grep materialresourcing
也会导致它
响应@jeroen问题更新
library(curl)
k<-curl_download("http://materialresourcing.com/tags/diy", "a.txt")
正如您只能看到此链接。 CLOSE_WAIT显示。使用rvest也会发生同样的事情。并且gc()在那里没有效果。
答案 0 :(得分:1)
通过卷曲手柄有意识地保持连接,以便可以重复使用。删除句柄对象或超出范围时,垃圾收集器会自动关闭连接。一个简单的演示:
# Connection is stored on a handle object
library(curl)
h <- new_handle()
# Connection is kept alive
curl_download("http://materialresourcing.com/tags/diy", "a.txt", handle = h)
system("lsof | grep materialresourcing")
# Still there :)
gc()
system("lsof | grep materialresourcing")
# Still there :)
rm(h)
system("lsof | grep materialresourcing")
# after handle gone, garbage collector closes connection
gc()
system("lsof | grep materialresourcing")
垃圾收集器会不时地在R中自动运行,因此curl会自行清理。但是,构建在curl
包上的一些包会故意保留句柄以提供持久性或更好的性能。因此,在这种情况下,连接将保持打开状态,直到应用程序从池中删除内部句柄。