这是一个非常简单的模块,可不断检查请求者的IP。我使用反向连接代理,这意味着它会在每个http请求上获取新IP。
defmodule Test do
def go() do
Enum.each(1..1, fn x ->
Task.Supervisor.async_nolink(Scraper.TaskSupervisor, fn ->
r = HTTPoison.get("https://api.ipify.org?format=json", [],
[timeout: 10_000, recv_timeout: 10_000, proxy: "ip:port", ssl: [{:versions, [:'tlsv1.2']}]])
case r do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
IO.inspect body |> Jason.decode
:timer.sleep(1000)
go()
end
end)
end)
end
end
Test.go()
:timer.sleep(2000000)
有问题吗?只要进程处于活动状态,HTTPoison(hackney)都不会释放连接,因此IP始终相同。 我将如何手动关闭内部连接:
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
IO.inspect body |> Jason.decode
答案 0 :(得分:1)
最简单的解决方案是设置pool: false
,整个请求如下所示:
HTTPoison.get(url, [], [
timeout: 5_000,
recv_timeout: 5_000,
proxy: proxy,
hackney: [pool: false],
ssl: [{:versions, [:'tlsv1.2']}]
])
答案 1 :(得分:0)
从HTTPoison
自述文件:
通常为 hackney opens and closes connections on demand,但它还会创建default pool个连接,这些连接可重复用于向同一主机的请求。如果连接和主机支持keepalive,则连接将保持打开状态,直到明确关闭为止。
HTTPoison
不会为基础套接字导出close
,并且自2017年以来就有open issue。
同时,您可以致电hackney_pool:stop_pool(:default)
。显然,这绝不是最佳解决方案,而且开销巨大。因此,我的建议是向HTTPoison
提供拉取请求以启用紧密连接功能(通过委派给;hackney_response.close/1
) 或简单地摆脱多余的HTTPoison
并只需使用hackney
。