为什么 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.Application
将 Users.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
是在后台调用的进程的接口。需要该抽象级别来为您封装连接池、超时、错误处理等。
当使用 Ecto 进行数据库查询时,我们将使用类似 Users.Repo.get!(id)
的东西,这当然有效,但为什么我 而不是 需要 send/receive
来与 Users.Repo
进程通信?为什么我可以简单地调用它只是引用模块和函数名称?
Users
是一个 OTP 应用程序,其中 Users.Application
将 Users.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
是在后台调用的进程的接口。需要该抽象级别来为您封装连接池、超时、错误处理等。