我希望每10ms运行一次周期性erlang进程(基于挂钟时间),10ms应该尽可能精确;什么应该是实施它的正确方法?如何以精确时间周期(即10ms)周期性运行Erlang进程
5
A
回答
6
如果你想真正可靠和准确的周期性过程中,你应该使用erlang:monotonic_time/0,1
依靠实际的挂钟时间。如果您使用Stratus3D的answer中的方法,您最终会落后。
start_link(Period) when Period > 0, is_integer(Period) ->
gen_server:start_link({local, ?SERVER}, ?MODULE, Period, []).
...
init(Period) ->
StartT = erlang:monotonic_time(millisecond),
self() ! tick,
{ok, {StartT, Period}}.
...
handle_info(tick, {StartT, Period} = S) ->
Next = Period - (erlang:monotonic_time(millisecond)-StartT) rem Period,
_Timer = erlang:send_after(Next, self(), tick),
do_task(),
{ok, S}.
可以在壳体试验:
spawn(fun() ->
P = 1000,
StartT = erlang:monotonic_time(millisecond),
self() ! tick,
(fun F() ->
receive
tick ->
Next = P - (erlang:monotonic_time(millisecond)-StartT) rem P,
erlang:send_after(Next, self(), tick),
io:format("X~n", []),
F()
end
end)()
end).
0
如果你真的想要尽可能精确,并且你确定你的任务比你想要执行的时间间隔更短,那么你可以有一个长时间运行的进程,而不是每隔10ms产生一个进程。 Erlang可以每隔10ms产生一个新进程,但除非有理由不能重复使用相同的进程,否则通常不值得开销(尽管它很少)。
我会做这样的事情在OTP gen_server:作为gen_server运行
periodic_task:start_link().
只要(如果它崩溃所以才会父:
-module(periodic_task).
... module exports
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
... Rest of API and other OTP callbacks
init([]) ->
Timer = erlang:send_after(0, self(), check),
{ok, Timer}.
handle_info(check, OldTimer) ->
erlang:cancel_timer(OldTimer),
Timer = erlang:send_after(10, self(), check),
do_task(), % A function that executes your task
{noreply, Timer}.
然后开始像这样的gen_server过程,因为它们被链接),功能do_task/0
几乎每10毫秒执行一次。请注意,这不会完全准确。执行时间会有一个漂移。实际的时间间隔将是10ms +接收定时器消息所需的时间,取消旧定时器并启动新定时器。
如果你想每隔10ms开始一个单独的进程,你可以让do_task/0
产生一个进程。请注意,这会增加额外的开销,但不一定会使得派生之间的间隔不太准确。
我的例子,从这个答案采取:What's the best way to do something periodically in Erlang?
相关问题
- 1. 周期精确仿真
- 2. 如何确定随机周期性过程的等待时间的期望值?
- 3. 用乔达时间周期显示“负”时间周期大小
- 4. AWS运行实例精确完整的结算周期金额
- 5. 的iCalendar2周间隔/周期
- 6. ios中的“精确”周期采样时间
- 7. ARM周期精确模拟器
- 8. 时间延迟/延迟估计非周期性信号(和周期性信号)
- 9. Android:以不同的睡眠时间间隔运行周期性任务
- 10. 如何限制no。的时间周期应该在Python运行
- 11. 我如何在http.get中运行周期
- 12. 如何运行componentwillmount生命周期onclick?
- 13. asio周期性定时器
- 14. 周的C#日期时间
- 15. 定制周期时间
- 16. 如何在Firebase JobDispatcher中设置周期性任务的周期?
- 17. 运行任务周期性(每天一次/每周一次)
- 18. 长时间运行的线程+生命周期
- 19. 运行时错误周期FLASH CS5
- 20. 执行周期性同步时出错
- 21. 100ms周期的便携式周期性定时器
- 22. python中的周期性定时器,小周期
- 23. .net性能周期?
- 24. 周期性协会
- 25. 加快Erlang编辑,编译,运行/调试周期
- 26. 在WebJobs长时间运行的进程中正确运行ADAL的AuthenticationContext生命周期管理
- 27. 确定日期是周日/周末java
- 28. 在周期性运行的线程中自动执行代码
- 29. Erlang JSON API数据生命周期
- 30. 如何更改Paypal周期性方法中的周期性金额(每月)
使用这种方法的好处是,小不可避免的错误不会在时间积累。 – Pascal