0

私はアーランが初めてです。アーランでプロセッサに割り込むことは可能かどうか疑問に思います。実行に長い時間がかかる関数 f1() を実行するプロセッサ x があるとします。プロセッサ x を中断して関数 f2() を実行する効率的な方法を見つけたいと思います。 f2() の実行後、中断された f1() の実行に戻ります。

これを行う 1 つの方法 (正確には私が望んでいるわけではありませんが) は、f1_proc の作成者が [interrupt、f1_terminated などのメッセージを待機している間、f1() をプロセッサ (名前は f1_proc) に実行させることです。ここで、割り込みが受信されると f2() が実行されます。

しかし、これはまさに私が望むものではありません。f2() が f1() に依存している場合はどうなりますか? この場合、f1() は一時停止され、f2() が実行され、その後 f1() は停止したところから開始する必要があります。プロセスを終了できることはわかっていますが、一時停止できますか?

4

3 に答える 3

2

あなたの質問に対する答えはノーです。これはできません。receiveプロセス内にフック (句など)を使用せずに、「外部」からプロセスを一時停止する方法はありません。

于 2012-04-19T18:55:44.820 に答える
0

これを行う 1 つの方法は、単純に両方の機能を異なるプロセスで開始することです。f2() が f1() の結果に依存している場合receive、必要なデータを含むメッセージです。f1() がそのデータの計算を完了すると、それを f2() プロセスに送信します。

f2() が receive 句に到達するのが早すぎる場合、メッセージが到着するまで自動的に一時停止して待機します (したがって、f1() は作業を続行します)。ただし、f1() が最初に実行されると、Erlang プロセス スケジューラによって自動的にプリエンプトされるまで、他のタスクを続行します。

f2() からのメッセージも待機させることで、f1() を一時停止させることもできます。その場合、デッドロックを回避するために、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 はそのメッセージ (およびそのメッセージのみ) を確実に受信します。

あなたがどのように Erlang を学んでいるかはわかりませんが、Cesarini & Thompson (O'Reilly) によるErlang Programmingという本をお勧めします。この本では、メッセージ パッシングと同時実行性について知っておく必要があるすべてのことを、非常に詳細に、また良い例とともに説明しています。

于 2012-04-19T10:56:33.263 に答える
0

あなたがerlangプロセスを操作しようとしていることを考えると、質問のタイトル(プロセッサ)は少し誤解を招くと思います。

erlang のhibernate コマンドを使用してみてください。上記のドキュメント リンクから直接:

Puts the calling process into a wait state where its memory allocation 
has been reduced as much as possible, which is useful if the process 
does not expect to receive any messages in the near future.

タイマーとプロセス間のメッセージ パッシングを使用すると、ワークフローを強制できます。つまり、時間がかかりすぎる場合は 1 つを一時停止し、他のものは作業を続けます。


ユースケースは質問ではあまり明確ではありませんが、両方の(実際にはより多くの)プロセスを互いに待つことなく並行して動作させ、プロセスがジョブを終了すると通知を受け取ることもできます。

于 2012-04-18T22:53:13.220 に答える