Erlang:何时使用函数vs进程?

时间:2014-04-16 20:24:56

标签: erlang idioms

我的任务是处理zip文件中的文件。所以我写了一堆独立的函数并组合它们以获得所需的结果。这是一种做事方式。现在不是把它全部写成函数,而是将它们中的一些写成具有选择性接收和所有的过程,而且每件事都很酷。但是后来进一步思考这个问题,我想,我们是否需要功能呢?我不能将所有这些功能替换或转换为与自身和其他进程通信的进程吗?所以我怀疑。何时使用功能以及何时使用流程?从使用功能(如缓存)的性能角度来看,是否有任何优势?进程中的代码块是否同样缓存?

所以在我们的例子中,标准的成语是什么?下面的当前伪代码。

start() ->
  FL = extract("..path"),
  FPids = lists:map(open_file, FL), %  get file Pids,
  lists:foreach(fun(FPid) ->
                  CPid = spawn_compute_process(),
                  rpc(CPid,{compute,FPid}) 
                end, FPids).

compute() ->
  receive
    {Pid,{..}} ->
      Line = read_line(..),
      TL = tidy_line(Line), % an independent function. But couldn't it be a guard within this process?
    ..
  end.

extract(FilePath) -> FilesList.

read_line(FPid) -> line.  

那么你如何编写代码呢?比如,首先编写较小的独立函数,然后将它们包装在进程中? 感谢。

1 个答案:

答案 0 :(得分:8)

简短的回答是您使用进程来利用并发性。用顺序运行一个进程的进程替换函数,然后将其值发送到另一个进程,然后进行其工作并将结果发送到下一个进程等,每个进程在完成其进程后终止是对进程的错误使用。在这里,您只是通过将数据从一个进程发送到另一个进程而不是调用函数来按顺序评估某些内容。

但是,如果您希望这个流程链能够同时处理多个“调用”序列,那么这是另一回事。然后,您正在使用并发进程。在erlang中执行此操作的更一般方法是为每个序列创建一个单独的进程,并以这种方式利用并发。

流程的另一个用途是管理状态。