How to make processes run in parallel in Erlang?

startTrains () → TotalDist = 100, Trains = [trainA, trainB], PID = spawn (fun () → train (1, length (trains)) end), [PID! {self (), TrainData, TotalDist} || TrainData & Trains], Receive {_From, Mesg} → error_logger: info_msg ("~ n Mesg ~ p ~ n", [Mesg]) after 10500 → update end.

So, I created two processes named trainA, trainB. I want to increase this process by 5 until it reaches 100. I made different processes so that each of the train (process) gradually increased its position. But I was surprised to get a way out consistently. Then the learning process ends, and then train B. processes it. But I want to build myself up at the same time. I want to run processes like this


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

but i get


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

How to make processes work in parallel / simultaneously? I hope you get my questions. Please help me.

+4
source share
1 answer

You start only one process, initialized by the train/2 function. Your code is incomplete, so I can only guess, but I think that your code is wrong, because you have only one train process. For inspiration:

 -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}. 

But if I think seriously, I should look at the principles of gen_fsm and OTP. But at your current stage, keep playing with erlang primitives to make you feel better.

+6
source

Source: https://habr.com/ru/post/1307516/


All Articles