相熟 erlang/elixir 的敌人们应该晓得 application 的概念,它是一种非凡的构造,用于启动和进行一个利用。每当咱们新建一个 erlang/elixir 我的项目,也同时新建了一个同名的 利用。在应用依赖库的时候,个别每个依赖库也是一个利用,会在咱们运行我的项目时被载入和启动。
那么,erlang是如何治理这些利用的呢?这就是 :application_controller 发挥作用的中央了。所有的利用的载入、启动等状态的保留和变更,都要通过这个过程。
# 列出以后的全副利用状态> :application_controller.info()虚利用不是所有的利用都会启动过程树,有些利用即便处于 :started 状态,也没有启动任何过程。权且称这种利用为虚利用吧。
跟踪利用我之前文章里提到的 bony_trance 库来跟踪一下 在load 和 start 一个利用时,:application_controller 过程都做了什么吧。
stop 利用iex(3)> :application_controller.stop_application :play#PID<0.44.0> RECEIVED +67.069019sMESSAGE: {:"$gen_call", {#PID<0.199.0>, #Reference<0.2783639343.3287547907.121340>}, {:stop_application, :play}}#PID<0.44.0> SENT TO: :code_server +0.000047sMESSAGE: {:code_call, #PID<0.44.0>, {:ensure_loaded, Logger.Translator}}#PID<0.44.0> RECEIVED +0.004582sMESSAGE: {:code_server, {:module, Logger.Translator}}#PID<0.44.0> SENT TO: :code_server +0.000033sMESSAGE: {:code_call, #PID<0.44.0>, {:ensure_loaded, Logger.Utils}}#PID<0.44.0> RECEIVED +0.002413sMESSAGE: {:code_server, {:module, Logger.Utils}}#PID<0.44.0> SENT TO: :code_server +0.000012sMESSAGE: {:code_call, #PID<0.44.0>, {:ensure_loaded, :calendar}}#PID<0.44.0> RECEIVED +0.012388sMESSAGE: {:code_server, {:module, :calendar}}12:38:54.714 [info] Application play exited: :stopped:ok#PID<0.44.0> SENT TO: Logger +0.000015sMESSAGE: {:notify, {:info, #PID<0.64.0>, {Logger, ["Application ", "play", " exited: " | ":stopped"], {{2021, 11, 28}, {12, 38, 54, 714}}, [erl_level: :notice, domain: [:otp], error_logger: %{report_cb: &:application_controller.format_log/1, tag: :info_report, type: :std_info}, file: "application_controller.erl", function: "info_exited/3", gl: #PID<0.64.0>, line: 2119, mfa: {:application_controller, :info_exited, 3}, module: :application_controller, pid: #PID<0.44.0>, report_cb: &:application_controller.format_log/2, time: 1638074334714339]}}}#PID<0.44.0> SENT TO: #PID<0.199.0> +0.000015sMESSAGE: {#Reference<0.2783639343.3287547907.121340>, :ok}首先向 code_server 确认一些必要的用于打印log的模块是已载入的, 这一步的后果会缓存,之后不用反复询问。如果该利用有 application 过程,则会向其发送 :stop 音讯。最初打印出利用已进行的log。
...