erlang并发编程-超时receive,注册进程

1.带超时的receive。 防止消息不来,receive语句陷入无限等待中。   只有超时的receive 功能:让当前进程暂停Tms。
sleep(T) ->
    receive
    after T ->
        true
    end.
超时时间为0的receive 超时时间为0的语句会立即触发一个超时,但在此之前,会尝试对邮箱进行模式匹配。
flush_buffer() ->
    receive
        _Any ->
	    flush_buffer()
    after 0 ->
        true
    end.
程序分析: 触发超时之前,会先进行模式匹配,_Any匹配到,又会调用flush_buffer(),一直到清空进程邮箱中的所有消息。 没有超时子句,在邮箱为空情况下,flush_buffer()会永久暂停,不会返回。
priority_receive() ->
    receive
        {alarm,X} ->
	    {alarm,X}
    after 0 ->
        receive
	    Any ->
	        Any
	end
    end.
触发超时前,进行模式匹配时,如果没有消息与{alarm,X}匹配那么执行后面会接收邮箱中的第一个消息。如果没有消息,会在内层的receive上暂停,然后返回它受到的第一个消息。 只有在邮箱中的消息都进行过模式匹配后才会检查after段是否需要进行运算。 2.注册进程。 4个BIF管理注册进程。 register(AnAtom,Pid) AnAtom为原子。注册进程Pid为原子AnAtom。如果该原子被另一个进程注册,那么注册失败。 unregister(AnAtom)移除对应的注册信息。如果一个注册进程死亡,那么也会自动取消注册。 whereis(AnAtom) -> Pid | undefined 判断原子是否被注册,如果被注册,返回进程id,如果没有被注册,返回原子undefined. registered() -> [AnAtom::atom()]返回系统中所有已经注册的名称列表。      

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply