执行流程沟通

时间:2016-09-29 04:53:37

标签: erlang erlang-shell

我刚开始阅读编程Erlang书。有一个单一的例子只适用于文件。

如果我执行:

> c(afile_server).
> c(afile_client).
> Server = afile_server:start(".").
> client:get_file(Server, "file1").
> client:get_file(Server, "file2").
> client:get_file(Server, "file3").

一切都只是文件。显示三个文件内容。

但如果我这样做:

> c(afile_server).
> Server = afile_server:start(".").
> Server ! { self(), { get_file, "file1" } }.
> receive 
   { Server, Content }
      Content
  end.

它只是文件。 但是如果我改变了我想要读取的文件(在第一次调用之后),例如

> Server ! { self(), { get_file, "file2" } }.
> receive 
   { Server, Content }
      Content
  end.

接收块并且不返回任何内容。 你们能以某种方式帮助吗?我想,这是一个非常愚蠢的错误! 问候。

文件:

服务器

-module(afile_server).
-export([start/1, loop/1]).

start(Dir) -> spawn(afile_server, loop, [Dir]).

loop(Dir) ->
    receive
    {Client, list_dir} ->
        Client ! {self(), file:list_dir(Dir)};
    {Client, {get_file, File}} ->
        Full = filename:join(Dir, File),
        Client ! {self(), file:read_file(Full)}
    end,
    loop(Dir).

客户端

%% ---
%%  Excerpted from "Programming Erlang, Second Edition",
%%  published by The Pragmatic Bookshelf.
%%  Copyrights apply to this code. It may not be used to create training material, 
%%  courses, books, articles, and the like. Contact us if you are in doubt.
%%  We make no guarantees that this code is fit for any purpose. 
%%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang2 for more book information.
%%---
-module(afile_client).
-export([ls/1, get_file/2]).

ls(Server) ->
    Server ! {self(), list_dir},
    receive 
    {Server, FileList} ->
        FileList
    end.

get_file(Server, File) ->
    Server ! {self(), {get_file, File}},
    receive 
    {Server, Content} ->
        Content
    end.

1 个答案:

答案 0 :(得分:3)

这是因为你在shell中运行它并在text.replace(/<br><br><br>/g, '<br><br>') 模式中重用名称Content,并且文件系统中的2个文件可能有不同的内容,因此receive阻止该进程获取具有相同内容的消息。要解决此问题,您可以每次为receive使用不同的名称,也可以使用Content明确“忘记”变量。

f(Content)