これを行う1つの方法は、単に異なるプロセスで両方の機能を開始することです。 f2()がf1()の結果に依存している場合は、必要なデータを含むメッセージをreceive
に送ります。 f1()がそのデータの計算を終えると、それはf2()プロセスに送られます。
f2()が受信句に早すぎると、メッセージは自動的に一時停止し、メッセージが到着するまで待機します(f1()は処理を継続します)。しかし、f1()が最初に実行された場合、Erlangプロセススケジューラによって自動的にプリエンプトされるまで、f1()は他のタスクを続行します。
f1()もf2()からのメッセージを待たせることで一時停止することもできます。その場合、デッドロックを回避するためにf1()がメッセージを送信した後で待機するようにしてください。
例:
f1(F2Pid) ->
Data = ...,
F2Pid ! {f1data, Data},
... continue other tasks ....
f2() ->
... do some work ...,
Data = receive
{f1data, F1Data} -> F1Data
end,
... do some work with Data ....
main() ->
F2Pid = spawn_link(?MODULE, f2, []),
f1(F2Pid).
このメッセージパッシングはErlangのプログラミング・モデルの基礎です。同期やロックを作成する必要はありません。ただメッセージを受け取れば、Erlangはあなたがそのメッセージを(そしてそのメッセージだけを)確実に受け取るようにします。
私はあなたがアーランを学んでいるのか分からないが、私はCesarini &トンプソン(オライリー)によってブックアーランプログラミングをお勧めします。本書では、メッセージの受け渡しと並行性について知っておく必要がある、詳細な例と優れた例を網羅しています。
ありがとう!これは答えがいかにであるべきであるかである。(私はそれであなたを信頼するつもりだ)。 – AJed