添运娱乐下载中心

添运娱乐下载中心-添运娱乐gg捕鱼手机版【中文版】

Erlang编程入门之添运娱乐gg捕鱼手机版并发编程—消息传递

  这个进程执行tut15:pong()。Pong_PID是这个进程“pong” 的标识符。函数start现在要创建另一个进程“ping”了。

  在Erlang进程之间传递的消息都是简单的合法的Erlang“短语(Term)”。可以是列表、元组、整数、常量或者pid什么的。

  每个进程都有自己的输入消息队列,用以接受消息。新的消息到达该进程时被放在队列的末尾。当一个进程执行一个receive,队列中的第一个消息被receive中的第一个模式(pattern)匹配测试,如果匹配,该消息从消息队列中删除,并且执行对应pattern下的操作。

  如此,如果第一个pattern没有被匹配成功,第二个模式就将被测试,如果匹配成功,该消息就会从消息队列中删除,并且执行对应pattern下的操作。如果第二个pattern仍然不能被测试为真,则该过程以此类推,直到没有pattern可供测试为止。如果没有pattern可供测试了,第一个消息将被保存在在消息队列中,并且开始第二个消息的匹配测试工作,如果这时第二个消息匹配成功了,则删除消息队列中的第二个消息,但是第一个消息和其他消息的状态并不受到任何影响。如果第二个消息还是匹配失败,则该过程持续下去,依次进行第三个、第四个消息的匹配。如果我们到了队列的末尾,该进程被阻塞(停止执行),并且等待新消息的到来,然后重新开始匹配的过程。

  当然,Erlang的实现是非常“聪明”的,并且能够最小化每个消息被接收方的receive测试的次数。

  Pong 等待着消息。如果常量finished被接收到,“pong” 将输出“Pong finished”,然后继续“无所事事”。如果它接收一个消息是下面的格式:

  消息(可以是任何的Erlang的Term)被用来向Pid标识的的进程发送消息。

  在pong发送消息到进程“ping”后,“pong”再次调用了 pong函数,这就让它回到了等待接受消息的那种状态,从而等待其他消息的到来。现在我们来看进程“ping”。回忆它是怎么开始运行的:

  并且当回复的消息到达时会输出“Ping received pong”,之后“ping”会再次调用ping函数。

  N-1 使得第一个参数递减,直到减到0为止。当减到0时,第一个子句ping/2会被执行:

  常量finished被发送给“pong”(这将导致接受方终止)并且输出“ping finished”。“ping”然后自己结束掉自己。