我试图使用timer:apply_after()
在未来几秒内执行一个函数,但是当我尝试编译模块时,它会抛出一个错误。
例如,假设我有一个带有两个函数的模块 - 一个打印一个年龄,另一个使用timer
来执行它。
-module(test).
-export([main/0]).
print_age(Age) ->
io:format("Your age: ~p~n", [Age]).
main() ->
timer:apply_after(2000, test, print_age, [20]).
当我编译模块时,我得到:
> c(test).
test.erl:4: Warning: function print_age/1 is unused
{ok,test}
答案 0 :(得分:3)
虽然timer docs中没有任何内容可以表明,但必须导出该函数才能让timer
执行该函数:
-module(test).
-export([main/0, print_age/1]).
print_age(Age) ->
io:format("Your age: ~p~n", [Age]).
main() ->
timer:apply_after(2000, test, print_age, [20]).
一个可以通过将-compile({nowarn_unused_function, {print_age,1}}).
添加到模块顶部来解决编译器错误,但是当计时器尝试执行时,它会变成运行时错误功能:
=ERROR REPORT==== 6-Jun-2018::13:37:14 ===
Error in process <0.89.0> with exit value:
{undef,[{test,print_age,[20],[]}]}
我不知道timer
如何运作的所有内部细节,但this answer表示它在一个单独的过程中在gen_server
中运行。< / p>
计时器模块是在单独进程中运行的标准gen_server。定时器模块中的所有功能都是公共接口,它们执行隐藏的gen_server:call或gen_server:强制转换到定时器服务器。这是隐藏服务器内部并允许进一步演进而不影响现有应用程序的常见用法。
我猜是有意义的,因为当前进程必须能够继续执行代码,并且必须在某个地方安全地存储要执行的函数,直到延迟通过。并且由于一个模块只能在导出的情况下访问另一个模块中的功能,因此必须导出要执行的功能。