首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTPoison手动关闭连接

HTTPoison手动关闭连接
EN

Stack Overflow用户
提问于 2019-03-18 08:11:31
回答 2查看 779关注 0票数 3

这是一个非常简单的模块,可以不断检查请求者的IP。我使用backconnect代理,这意味着它在每次http请求时都会获得新的IP。

代码语言:javascript
复制
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始终是相同的。如何手动关闭内部连接:

代码语言:javascript
复制
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
          IO.inspect body |> Jason.decode
EN

回答 2

Stack Overflow用户

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2019-03-19 03:34:21

最简单的解决方案是设置pool: false,整个请求看起来像这样:

代码语言:javascript
复制
HTTPoison.get(url, [], [
  timeout: 5_000,
  recv_timeout: 5_000,
  proxy: proxy,
  hackney: [pool: false],
  ssl: [{:versions, [:'tlsv1.2']}]
])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55213222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档