我应该更喜欢什么:
erlang:start_timer(Ttl, self(), time_to_die)
或者
timer:send_after(Ttl, self(), {timeout, time_to_die})
如果我的用例是将单个原子消息发送到 gen_server?我预计会有数十万个 gen_servers,其中每一个都需要有一个关联的 TTL 计时器事件。
我应该更喜欢什么:
erlang:start_timer(Ttl, self(), time_to_die)
或者
timer:send_after(Ttl, self(), {timeout, time_to_die})
如果我的用例是将单个原子消息发送到 gen_server?我预计会有数十万个 gen_servers,其中每一个都需要有一个关联的 TTL 计时器事件。
Erlang Efficiency Guide的Common Caveats 部分说:
erlang:send_after/3
使用和创建定时器比使用模块erlang:start_timer/3
提供的定时器更有效。timer
该timer
模块使用单独的进程来管理计时器,如果许多进程频繁创建和取消计时器(尤其是在使用 SMP 仿真器时),该进程很容易过载。
timer
模块中不管理定时器的函数(如timer:tc/3
ortimer:sleep/1
),不调用 timer-server 进程,因此是无害的。