检查并行处理计算功能相同(Check if parallel processes evaluate

2019-10-19 17:33发布

由于几天,我学二郎,用伟大的书编程二郎乔·阿姆斯特朗。

我下面讲并行编程的章节,并在本章的最后,有解决一个小问题:

写一个函数开始(AnAtom,游戏)作为菌种(FUN)注册AnAtom。 确保你的程序中,当两个平行的过程同时评估开始/ 2的情况下正常工作。 在这种情况下,你必须保证这些过程中的一个成功,另一个失败。

我解决了这个问题的第一个部分,确保每个进程将与不同的原子催生。

关于第二部分,我坚持,因为,如果我理解正确的话,我无法找到一个方法来检查两个平行的过程同时评估功能start/2 。 起初,我想过一个计数器检查过程中产卵的数量,但我无法理解如何执行此检查。 我发现了一些有趣的事情在这里这个线程 (从OOP背景的人,我想到了Singleton模式),但我不知道是否读取和写入与计数器的文件是执行此检查的最佳途径。 我认为有一个简单的方法来做到这一点。

我写的代码如下:

-module(probl).
-export([start/2,stop/1]).

start(Atom,Fun) ->
% check here counter value
case isUniqueProcess(Times) of % here I'm trying to use a counter, but I'm stuck..
    true ->
        Pid = spawn(fun() -> doSomething(Atom,Fun) end), 
        register(Atom,Pid);
    false ->
        io:format("Sorry, no more processes to spawn."),
        void
end.    

stop(Atom) -> 
    case whereis(Atom) of
        undefined -> void;
        Pid -> io:format("Stopped."), Pid ! stop
    end.

isUniqueProcess(Times) -> % here I should increment the counter, but how?
    if
        Times =:= 0 ->
            true;
        Times > 0 ->
            false
    end.

doSomething(Atom,Fun) ->
    receive
        stop -> void
    after 15000 ->
        Fun(),
        doSomething(Atom,Fun)
    end.

对我来说,从一个强大的面向对象的背景的,它不是那么容易切换另一种编程的心态,就像它发生在二郎,也许这是我困难的原因。 我怎么解决这个问题?

Answer 1:

如果两个或多个进程,尝试以相同的名称注册那么只有第一个将成功。 当他们尝试注册下面将产生错误。 是不够的只是为了让这种情况下的后续处理会崩溃吗? 要做到这一点,必须登记在启动过程本身来完成。

如果你不想崩溃的过程中,你可以换的过程中捕捉和终止,明确使用终止它exit(normal)



Answer 2:

你可以试试这个代码。

start(Atom, Fun) when is_atom(Atom), is_function(Fun, 0) ->
    Sender = self(),
    Fun2 = fun() ->
           case catch register(Atom, self()) of
               true ->
               Sender ! {started, self()},
               Fun();
               _ ->
               Sender ! {already_running, self()}
           end
       end,
    Pid = spawn(Fun2),
    receive
    {started, Pid} ->
        {ok, Pid};
    {already_running, Pid} ->
        already_running
    end.


Answer 3:

使用rvirding方法:

start(AnAtom, Fun) ->
  spawn(fun() -> register(AnAtom, self()), Fun() end).

或者:

start(AnAtom, Fun) ->
  spawn(fun() -> case catch register(AnAtom, self()) of true -> Fun(); _ -> ok end end).


文章来源: Check if parallel processes evaluate same function
标签: erlang