这是一个非常简单的模块,可以不断检查请求者的IP。我使用backconnect代理,这意味着它在每次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发布于 2019-03-18 14:17:50
从HTTPoison自述文件中:
通常会对hackney opens and closes connections on demand执行操作,但它也会创建一个连接的default pool,这些连接将重复用于对同一主机的请求。如果连接和主机支持保持连接,则连接将保持打开状态,直到显式关闭。
HTTPoison不会导出底层套接字的close,自2017年起就有了open issue。
同时,您可以调用hackney_pool:stop_pool(:default)。无论如何,这显然不是最优的解决方案,而且它有巨大的开销。所以我的建议是,要么向HTTPoison提供一个拉取请求,启用紧密连接功能(通过委托给;hackney_response.close/1),要么干脆去掉冗余的HTTPoison,直接使用hackney。
发布于 2019-03-19 03:34:21
最简单的解决方案是设置pool: false,整个请求看起来像这样:
HTTPoison.get(url, [], [
timeout: 5_000,
recv_timeout: 5_000,
proxy: proxy,
hackney: [pool: false],
ssl: [{:versions, [:'tlsv1.2']}]
])https://stackoverflow.com/questions/55213222
复制相似问题