为什么 Ecto.Repo 进程不需要 `send/receive`?

Why does Ecto.Repo process not need `send/receive`?

当使用 Ecto 进行数据库查询时,我们将使用类似 Users.Repo.get!(id) 的东西,这当然有效,但为什么我 而不是 需要 send/receive 来与 Users.Repo 进程通信?为什么我可以简单地调用它只是引用模块和函数名称?

Users 是一个 OTP 应用程序,其中 Users.ApplicationUsers.Repo 进程作为子进程加载到 Users.Supervisor 进程

  ...

  def start(_type, _args) do
    children = [
      Users.Repo,
    ]
    opts = [strategy: :one_for_one, name: Users.Supervisor]
    Supervisor.start_link(children, opts)
  end

Users.Repo 得到 Ecto.Repo 注入 use Ecto.Repo and hence default get/3 implementation is delegated to Ecto.Repo.Queryable.get/3 and then down to adapter.execute/5.

adapter 反过来已经是一个 GenServer 并且 execute/5 是在后台调用的进程的接口。需要该抽象级别来为您封装连接池、超时、错误处理等。