Как остановить процесс Postgrex и его процесс TypeServer? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть несколько тысяч баз данных. Я хочу подключиться к каждому из них последовательно по одному и выполнить запрос. Я делаю это, запуская процесс Postgrex, подобный этому, для каждого.

  {:ok, pid} =
    Postgrex.start_link(
      port: database.port,
      hostname: database.host,
      username: database.username,
      password: database.password,
      database: database.database_name
    )   

Затем я выдаю Postgrex.query, а затем останавливаю его вот так

  :ok = GenServer.stop(pid, :normal)

Кажется, все работает хорошо, за исключением того, что у меня заканчиваются тысячи Postgrex.TypeServer процессов, занимающих память, которые, кажется, не очищаются в течение длительного времени.

Есть ли лучший способ очистить процесс Postgrex так что TypeServer тоже остановлен?

Я на Postgrex 0.13.3.

РЕДАКТИРОВАТЬ:

Чтобы немного прояснить ситуацию, я бы хотел очищайте TypeServer после каждого процесса Postgrex. Очистка всех TypeServers после того, как весь Enum.map сделан, не так уж полезна для меня, потому что это приводит к медленному росту памяти, за которым следует резкое падение, а не плоская линия.

Enum.map(databases, fn database ->
  {:ok, pid} = Postgrex.start_link(port: database.port, hostname: database.host, username: database.username, password: database.password, database: database.database_name)   
  Postgrex.query!(pid, "some query", [])
  :ok = GenServer.stop(pid, :normal)
  # something here to clean up the TypeServer
end)

1 Ответ

0 голосов
/ 06 апреля 2020

Я не копал до самого дна, но Postgrex.TypeServer s управляется dynamici c Postgrex.TypeSupervisor, то есть, к счастью, начинается с жестко заданного имени .

Так что мое дикое предположение будет следующим:

DynamicSupervisor.stop(Postgrex.TypeSupervisor)

Кроме того, отключение Postgrex.App также должно помочь

Application.stop(:postgrex)
...