在某些情况下,rvest保持连接开放?

时间:2015-09-11 13:19:00

标签: r rvest

在某些情况下,rvest似乎将TCP FD置于CLOSE_WAIT状态。

复制示例: 在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()在那里没有效果。

1 个答案:

答案 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包上的一些包会故意保留句柄以提供持久性或更好的性能。因此,在这种情况下,连接将保持打开状态,直到应用程序从池中删除内部句柄。