2010-04-21 64 views
4

startTrains() - > TotalDist = 100, 列车= [trainA,trainB], PID =产卵(乐趣() - > 列车(1,长度(火车)))结束时, [PID! {self(),TrainData,TotalDist} || TrainData < - 列车], 接收 {_From,MESG} - > error_logger:info_msg( “〜n的MESG〜p〜n的”,[MESG]) 后10500 - > 刷新 端。如何使进程在Erlang中并行运行?

因此,我创建了名为trainA,trainB的两个进程。我想将这些过程增加5,直到它达到100.我制作了不同的过程,以使每个火车(过程)平行地增加其位置。但我很惊讶地得到输出,即过程训练A结束然后过程训练B开始。但我想同时增加自己。 我想这样


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

运行的进程,但我m到处


trainA 0 
.... 
trainA 90 
trainA 95 
trainA 100 
trainA ends 

trainB 0 
trainB 5 
trainB 10 
..... 
trainB 100 

如何使流程并行运行/同步?希望你得到我的Q。请帮帮我。

回答

6

您只产生一个由函数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原则。但是,在你现在的阶段,继续玩erlang原语,首先会有更好的感觉。

+1

谢谢TON! :) 你让我今天一整天都感觉很好。我在Erlang为我的大师写了“防碰撞铁路系统”。我想演示我的调度器来模拟火车。是的,你是绝对正确的!我只是创建一个进程并发送两个列车进程来运行(这确实是一个连续运行)。 – iankits 2010-04-21 14:51:56