我希望每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. ARM周期精确模拟器
- 2. 时间延迟/延迟估计非周期性信号(和周期性信号)
- 3. Android:以不同的睡眠时间间隔运行周期性任务
- 4. 周的C#日期时间
- 5. 运行任务周期性(每天一次/每周一次)
- 6. 如何在Firebase JobDispatcher中设置周期性任务的周期?
- 7. 长时间运行的线程+生命周期
- 8. 运行时错误周期FLASH CS5
- 9. 执行周期性同步时出错
- 10. 100ms周期的便携式周期性定时器
- 11. 加快Erlang编辑,编译,运行/调试周期
- 12. 在WebJobs长时间运行的进程中正确运行ADAL的AuthenticationContext生命周期管理
- 13. 确定日期是周日/周末java
- 14. 在周期性运行的线程中自动执行代码
- 15. 以可变采样率对周期性数据进行平均
- 16. PHP日期时间:获取日期基于月,周和一周的日期
- 17. 在iOS8上以后台模式运行周期性任务
- 18. mybatis批处理执行期间的周期性冲洗
- 19. 如何使用reactjs在周期性时间渲染数据
- 20. 如何存储周期性时间窗口
- 21. 时间间隔周期在SQL
- 22. Java:使用定时器周期性地运行一个方法
- 23. 周期性变化HTML体在运行时的内容 -
- 24. 如何在设定的时钟周期内运行模拟
- 25. 进口周期RSA 8.5
- 26. 如何计算周期性数字?
- 27. 如何解决球体的周期性?
- 28. 我如何处理周期性结算?
- 29. 如何执行持续的,变化的时间周期
- 30. 贝宝周期性+购买
使用这种方法的好处是,小不可避免的错误不会在时间积累。 – Pascal