erlang timer

来源:互联网 发布:百度阅读json文件转换 编辑:程序博客网 时间:2024/04/28 12:19

erl + c

erl +c 可以禁用系统时间变化所引起的补偿
通常状态下erlang:now/0 是不会把突然的时间变化反应到系统时间的,而是会进行慢性的调整, 这么做是为了保证timer的工作。加入 +c 后, erlang:now/0 会立即反应到系统时间上, 相应的timer的timeout 也可能会出现在错误的时间。

timer 的函数总结

  1. erlang:start_timer(Time, Dest, Msg) -> TimeRef

    Time: 最大的值为2^32 -1 milliseconds, 大概不到50天的时间
    Dest: 必须是本地节点 类型为atom()|pid()
    1. 如果是Dest::atom(), 即便这个Dest 没有绑定一个process 也不会报错, 而是返回正常的TimeRef。但是在进程不存在和进程退出的情况下,该timer 不是立即取消,而是在Time 时间结束的时候才取消的。
    2. 如果是Name::pid(), 如果进程存在或者进程退出,该timer 会立即取消
    这里写图片描述

  2. erlang:send_after/3

    参数和erlang:start_timer 一样, 两者的区别在于当timer timeout 的时候, 发送的消息不同。send_after 发送 Msg, 而start_timer 发送{timeout, TimerRef, Msg}.
    两种消息的区别在于, 当我们cancel 一个timer的时候,我们并不能保证那个Msg 从进程信箱中去除,如果有timerRef , 我们可以参考gen_fsm里cancel_timer的方法, 利用receive..after 0 来匹配TimeRef, 进而去除进程信箱中的Msg, 但是如果是send_after 我们没有办法做到这一点。

  3. erlang:cancel_timer(TimeRef) -> Time|false

    如果是 cancel 一个存在的timer, 返回的是剩余的时间
    如果是 cancel 一个不存在的timer, 返回的是false
    note: 我们并不能保证,我们cancel timer 后, 进程信箱中没有这个 Timer 的 msg
    ( 想要去除 该Msg, 实现参考 gen_fsm:cancel_timer).

  4. timer module 中也有起定时器的操作, 但是这个timer 会有一个独立的进程去处理这个定时器,所以如果有很多进程都用这个module 进行起和删除定时器的话, 效率上自然有问题。

引用:
[1] 坚强 2002 Erlang Timer
[2] mryufeng erlang:send_after和erlang:start_timer的使用解释

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新车尾箱坏了怎么办 放书的箱子烂了怎么办 车钥匙锁后备箱里怎么办 布的收纳箱有味怎么办 车漆清漆层掉了怎么办 副驾驶储物箱卡子断了怎么办 玛莎拉蒂车门打不开怎么办 新买的水杯漏水怎么办 泰迪小狗掉毛怎么办 手机jlc调用接口状态异常怎么办 进门和厕所对着怎么办 p过的照片有竖条怎么办 当照片p出竖条纹怎么办 月子里落下脚心怕风怕凉怎么办 鞋胶把手粘住了怎么办 凉鞋魔术贴长了怎么办 新买的狗一直叫怎么办 刚买的幼犬老叫怎么办 狗狗什么都不吃怎么办 新买的吊扇风小怎么办 夜市卖果汁没电怎么办 榻榻米太长2米45怎么办 木质桌子黏黏的怎么办 白色塑料桌子染色了怎么办 3dmax模型变透明了怎么办 刚养的兔子不吃怎么办 熊猫兔不吃下喝怎么办 熊猫兔感冒了一直打喷嚏怎么办 兔子后腿骨断了怎么办 兔子的腿肿了怎么办 仓鼠喝了牛奶该怎么办 宠物兔不吃不喝怎么办 兔子把木屑吃了怎么办? 小车司机碰瓷大车司机怎么办 在淘宝买到假的护肤品怎么办 淘宝购物发现是假的怎么办 电脑键盘灯不亮不能打字怎么办 海棠兔屁股有屎怎么办 大冒险告白被接受了怎么办剧透微博 大冒险被告白了怎么办 腐书网 大冒险告白被接受了怎么办 006