`
mryufeng
  • 浏览: 981821 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

erlang:send_after和erlang:start_timer的使用解释

阅读更多
前段时间arksea 同学提出这个问题, 因为文档里面写的很不明白.

    erlang:send_after(Time, Dest, Msg) -> TimerRef
    Time = int()
    0 <= Time <= 4294967295
    Dest = pid() | RegName
    LocalPid = pid() (of a process, alive or dead, on the local node)
    Msg = term()
    TimerRef = ref()
    Starts a timer which will send the message Msg to Dest after Time milliseconds.

    If Dest is an atom, it is supposed to be the name of a registered process. The process referred to by the name is looked up at the time of delivery. No error is given if the name does not refer to a process.

    If Dest is a pid, the timer will be automatically canceled if the process referred to by the pid is not alive, or when the process exits. This feature was introduced in erts version 5.4.11. Note that timers will not be automatically canceled when Dest is an atom.

    See also erlang:start_timer/3, erlang:cancel_timer/1, and erlang:read_timer/1.

    Failure: badarg if the arguments does not satisfy the requirements specified above.

    erlang:start_timer(Time, Dest, Msg) -> TimerRef
    Time = int()
    0 <= Time <= 4294967295
    Dest = LocalPid | RegName
    LocalPid = pid() (of a process, alive or dead, on the local node)
    RegName = atom()
    Msg = term()
    TimerRef = ref()
    Starts a timer which will send the message {timeout, TimerRef, Msg} to Dest after Time milliseconds.

    If Dest is an atom, it is supposed to be the name of a registered process. The process referred to by the name is looked up at the time of delivery. No error is given if the name does not refer to a process.

    If Dest is a pid, the timer will be automatically canceled if the process referred to by the pid is not alive, or when the process exits. This feature was introduced in erts version 5.4.11. Note that timers will not be automatically canceled when Dest is an atom.

    See also erlang:send_after/3, erlang:cancel_timer/1, and erlang:read_timer/1.

    Failure: badarg if the arguments does not satisfy the requirements specified above.

表面上看这2个API没有什么大的差别,使用上也一样, 那为什么要搞二个呢? 好奇怪!

好, 让我们来好好研究下典型应用.

这2个API都返回 TimerRef. 用户可以用这个TimerRef来取消定时器. 唯一的差别是在超时的时候发送的消息不同: send_after是Msg, start_timer是{timeout, TimerRef, Msg}.
问题就出在取消timer的时候. 如果这个timer还没有超时的时候, 那么取消就没问题. 如果超时了麻烦就来了, 这个消息已经有可能已经被放到目标进程的消息队列里,等待派遣处理了.

这时候send_after里面存放的是Msg, 那用户如何知道Msg是对于那个TimerRef的呢? 读者可能说, 那我可以在消息里面加入TimerRef. 这个主意不错, 但是问题是在send_after调用返回之前, 你是无法得到TimerRef, 当然也就无从构造这个消息, 那就无法处理这个可能的超时信息, 就会破坏逻辑.
所以erts version 5.4.11 引入了, start_timer来解决这个问题. 它是自动的在超时后, 要发送消息前, 在消息里面添加了{timeout, TimerRef, Msg}, 达到识别的目的.

结论: 文档里面一眼带过的东西, 其实是有很多设计方面的考虑, 要认真考虑它的存在的意义.
分享到:
评论

相关推荐

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang-sd_notify-1.0-2.el7.x86_64.rpm

    erlang的timer和实现机制

    `timer:apply_after/4`与`send_after/3,4`类似,但不是发送消息,而是应用指定的函数和参数。这可以用来在将来某个时刻执行一个特定的操作,无需手动创建和管理进程。 `timer:cancel_timer/1`接收一个定时器引用,...

    esl-erlang_23.0_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    erlang_otp_win64_20.3.zip

    是erlang_otp_20.3 的win64安装包,内为exe文件,一路next即可安装完成 是适用于多线程、分布式开发的语言,也是如rabbitmq等重要工具的必须品 使用前需要配置环境变量:1.变量名为ERLANG_HOME,变量值为安装Erlang...

    Erlang安装包,版本:otp_win64_24.1.7.exe

    otp_win64_24.1.7.exe

    esl-erlang_23.0_windows_amd64.exe

    这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载

    Erlang_B_model.rar_Erlang B _Erlang B model_Wireless Handbook_e

    **无线通信手册**通常会包含Erlang B模型的详细解释和应用实例,帮助工程师理解和计算通信网络的性能。在这个压缩包中,我们有一个名为"Erlang_B_model.pdf"的文件,它很可能是这样的手册的一部分,提供了关于Erlang...

    erlang_otp_win64_25.0

    2. **OTP**:Open Telecom Platform,开放电信平台,是一套库、设计原则和开发工具的集合,旨在简化使用Erlang开发大型、高可用性的分布式系统的过程。它包括了进程管理、错误恢复、分布式计算、监控工具等核心组件...

    erlang_environment_win64_21.0.1.zip

    Erlang是一种高级编程语言,特别适用于并发处理和分布式系统,尤其在电信、银行和互联网领域广泛应用。"erlang_environment_win64_21.0.1.zip" 是一个专门为Windows 10 64位操作系统提供的Erlang开发环境的安装包。...

    Erlang-Formula.zip_Erlang B _Erlang-B_erlang_erlang B计算_erlang C

    Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...

    erlang_otp_20.3_man开发手册

    erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册,erlang_otp_20.3_man开发手册

    erlang_otp_src_17.3.tar.gz

    5. **验证**:安装完成后,可以通过运行`erl`命令启动Erlang shell,并使用`erlang:system_info(otp_release)`检查版本是否正确。 RabbitMQ是一种基于Erlang OTP平台的消息队列服务器,它利用Erlang的并发特性和OTP...

    erlang_otp_src_22.3.tar.gz

    首先,Erlang 语言以其独特的并发模型闻名,它使用轻量级进程(Lightweight Processes,LWP)来实现并发执行。这些进程具有低开销,使得在单个硬件上可以同时运行成千上万个进程。这使得 Erlang 在处理大规模并发...

    最新版 erlang安装包 otp_src_21.3.tar.gz

    Erlang是一种强大的编程语言,尤其在分布式计算、并发处理和实时系统中有着广泛的应用。OTP(Open Telecom Platform)是Erlang的核心组件,提供了一系列的库和设计原则,用于构建可靠、可扩展的系统。在Linux CentOS...

    esl-erlang_19.3_osx_10.10_amd64.dmg

    8. **Erlang社区和工具**:Erlang拥有活跃的开发者社区,提供丰富的开源库和工具,如Rebar3用于构建和管理Erlang项目,Elixir则是在Erlang VM上运行的另一种语言,提供了更面向对象的语法。 9. **编译与调试**:...

    erlang otp_src_20.2.tar.gz

    7. **启动和管理RabbitMQ**:安装完成后,可以使用`sudo rabbitmq-server start`启动RabbitMQ服务器,`sudo rabbitmq-plugins enable rabbitmq_management`启用管理插件以访问Web管理界面。管理界面默认在`...

    xiandiao_erlang_Erlang课后习题_

    5. **简洁的错误处理**:Erlang使用“let it crash”哲学,鼓励快速失败和快速恢复。错误通常通过抛出异常来处理,而不是通过复杂的错误检查逻辑。 6. **模式匹配**:Erlang的函数调用允许模式匹配,使得解构复杂...

    erlang_win_64位安装包

    Erlang是一种高级编程语言,主要用于构建分布式、并发、 fault-tolerant 和实时系统。它由Ericsson公司为电信应用而开发,现在已经成为开源社区的重要组成部分。Erlang以其强大的并行处理能力和对高可用性系统的支持...

Global site tag (gtag.js) - Google Analytics