gpt4 book ai didi

erlang - 如何让进程在 Erlang 中并行运行?

转载 作者:行者123 更新时间:2023-12-05 00:41:53 25 4
gpt4 key购买 nike

开始火车()->
总距离 = 100,
火车 = [trainA,trainB],
PID = spawn(fun() ->
火车(1,长度(火车))结束),
[PID! {self(),TrainData,TotalDist} || TrainData <- 火车],
收到
{_From, Mesg} ->
error_logger: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。请帮我。

最佳答案

您只生成一个由函数 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 原语以获得更好的感觉。

关于erlang - 如何让进程在 Erlang 中并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2680922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com