HTTPoison手动关闭连接

时间:2019-03-18 00:11:31

标签: elixir httpoison

这是一个非常简单的模块,可不断检查请求者的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

2 个答案:

答案 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