2010-04-21 66 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