使用 HTTP.jl 设置获取请求的超时
Set timeout for get request with HTTP.jl
我必须扫描 IP 范围并希望减少超时等待时间。
我如何使用 Julia 的 HTTP.jl 包指定请求超时?
我在 v.0.6.15 的文档中找到了 readtimeout
选项:
conf = (readtimeout = 10,
pipeline_limit = 4,
retry = false,
redirect = false)
HTTP.get("http://httpbin.org/ip"; conf..)
但在当前的稳定版本中v0.8.6 readtimeout
接缝只出现在服务器端。
使用 readtimeout=2
和 v.0.8.6 的测试代码:
@time begin
try
HTTP.get("http://2.160.0.0:80/"; readtimeout=2)
catch e
@info e
end
end
输出:
113.642150 seconds (6.69 k allocations: 141.328 KiB)
┌ Info: IOError(Base.IOError("connect: connection timed out (ETIMEDOUT)", -4039) during request(http://2.160.0.0:80/))
└ @ Main In[28]:5
所以这个请求花了大约 114 秒,因此我认为这个选项目前不受支持。
编辑
我检查了稳定版的源代码(HTTP.jl):
Timeout options
- `readtimeout = 60`, close the connection if no data is received for this many
seconds. Use `readtimeout = 0` to disable.
给出这个例子:
HTTP.request("GET", "http://httpbin.org/ip"; retries=4, cookies=true)
HTTP.get("http://s3.us-east-1.amazonaws.com/"; aws_authorization=true)
conf = (readtimeout = 10,
pipeline_limit = 4,
retry = false,
redirect = false)
HTTP.get("http://httpbin.org/ip"; conf..)
HTTP.put("http://httpbin.org/put", [], "Hello"; conf..)
所以它应该可以工作...
它绝对没有达到预期的效果。
这里发生了很多事情:
首先,HTTP.jl 中幂等请求的默认设置是重试 4 次。所以 HTTP.get
只会在 5 * readtimeout
之后失败。您可以通过在参数中传递 retry = false
来更改它。
我注意到的第二件事是检查超时连接的时间间隔很长。 (参见 TimeoutRequest Layer)它仅每 8 到 12 秒检查一次超时,因此低于 8 秒的超时不会执行任何操作。 (我怀疑这些应该是 8-12 毫秒而不是实现的秒数)
最后,HTTP.request 缺少 0.8.6 的文档。我已经 made a PR 解决了这个问题。
我必须扫描 IP 范围并希望减少超时等待时间。 我如何使用 Julia 的 HTTP.jl 包指定请求超时?
我在 v.0.6.15 的文档中找到了 readtimeout
选项:
conf = (readtimeout = 10,
pipeline_limit = 4,
retry = false,
redirect = false)
HTTP.get("http://httpbin.org/ip"; conf..)
但在当前的稳定版本中v0.8.6 readtimeout
接缝只出现在服务器端。
使用 readtimeout=2
和 v.0.8.6 的测试代码:
@time begin
try
HTTP.get("http://2.160.0.0:80/"; readtimeout=2)
catch e
@info e
end
end
输出:
113.642150 seconds (6.69 k allocations: 141.328 KiB)
┌ Info: IOError(Base.IOError("connect: connection timed out (ETIMEDOUT)", -4039) during request(http://2.160.0.0:80/))
└ @ Main In[28]:5
所以这个请求花了大约 114 秒,因此我认为这个选项目前不受支持。
编辑 我检查了稳定版的源代码(HTTP.jl):
Timeout options
- `readtimeout = 60`, close the connection if no data is received for this many
seconds. Use `readtimeout = 0` to disable.
给出这个例子:
HTTP.request("GET", "http://httpbin.org/ip"; retries=4, cookies=true)
HTTP.get("http://s3.us-east-1.amazonaws.com/"; aws_authorization=true)
conf = (readtimeout = 10,
pipeline_limit = 4,
retry = false,
redirect = false)
HTTP.get("http://httpbin.org/ip"; conf..)
HTTP.put("http://httpbin.org/put", [], "Hello"; conf..)
所以它应该可以工作...
它绝对没有达到预期的效果。 这里发生了很多事情:
首先,HTTP.jl 中幂等请求的默认设置是重试 4 次。所以 HTTP.get
只会在 5 * readtimeout
之后失败。您可以通过在参数中传递 retry = false
来更改它。
我注意到的第二件事是检查超时连接的时间间隔很长。 (参见 TimeoutRequest Layer)它仅每 8 到 12 秒检查一次超时,因此低于 8 秒的超时不会执行任何操作。 (我怀疑这些应该是 8-12 毫秒而不是实现的秒数)
最后,HTTP.request 缺少 0.8.6 的文档。我已经 made a PR 解决了这个问题。