代码之家  ›  专栏  ›  技术社区  ›  Ankit Singh

如何使进程在Erlang中并行运行?

  •  4
  • Ankit Singh  · 技术社区  · 15 年前

    starttrains()-> 总距离=100, 列车=[列车,列车号], pid=产卵(fun()-> 列车(1,长度(列车))结束) [PID!self(),traindata,totaldist traindata<-列车], 接收 来自,Mesg-> 错误日志:info_msg(“~n mesg~p~n”,[mesg]) 10500之后-> 刷新 结束。

    所以,我创建了两个过程,叫做traina,trainb。我想把这个过程增加5到100。我做了不同的处理,使每一列(处理)的位置平行增加。但是我很惊讶地得到了连续的输出,即处理traina结束,然后处理trainb开始。但我想同时增加自己。 我想运行这样的进程


    trainA 10 trainB 0
    trainA 15 trainB 5
    ....
    trainA 100 trainB 100 
    

    但我正在得到


    trainA 0
    ....
    trainA 90
    trainA 95
    trainA 100
    trainA ends
    
    trainB 0
    trainB 5
    trainB 10
    .....
    trainB 100
    

    如何使进程并行/同时运行?希望你能拿到我的Q。请帮帮我。

    1 回复  |  直到 15 年前
        1
  •  6
  •   Hynek -Pichi- Vychodil Paulo Suassuna    15 年前

    只能生成一个由函数初始化的进程 train/2 . 您提供的代码不完整,所以我只能猜测,但我认为您的代码是错误的,因为您只有一个列车过程。灵感来源:

    -module(trains).
    
    -export([startTrains/0]).
    
    startTrains() ->
      TotalDist = 100,
      Names = [trainA,trainB ],
      Self = self(),
      Trains = [spawn_link(fun() -> 
              train(Name, Self) end) || Name <- Names],
      [ Train ! {start, Self, 0, TotalDist} || Train <- Trains],
      ok = collectResults(Names).
    
    collectResults([]) -> ok;
    collectResults(Trains) ->
      receive
        {stop, Name, Pos, Length} ->
          io:format("~p stops at ~p (~p)~n", [Name, Pos, Length]),
          collectResults(Trains -- [Name]);
        Msg ->
          io:format("Supervisor received unexpected message ~p~n", [Msg]),
          collectResults(Trains)
      after 10500 -> timeout
      end.
    
    train(Name, Sup) ->
      receive
        {start, Sup, Pos, Length} -> run_train(Name, Sup, Pos, Length);
        Msg ->
          io:format("~p received unexpected message ~p~n", [Name, Msg]),
          train(Name, Sup)
      end.
    
    run_train(Name, Sup, Pos, Length)
      when Pos < Length ->
        receive after 500 ->
            NewPos = Pos + 5,
            io:format("~p ~p~n", [Name, Pos]),
            run_train(Name, Sup, NewPos, Length)
        end;
    run_train(Name, Sup, Pos, Length) ->
      Sup ! {stop, Name, Pos, Length}.
    

    但如果我认真考虑的话,我应该 gen_fsm 以及OTP原则。但在你目前的阶段,继续与二郎原始人玩,以获得更好的感觉第一。