2012-04-18 10 views
0

私はerlangを初めて使用しています。 erlangのプロセッサを中断することが可能かどうか疑問に思います。プロセッサxが関数f1()を実行し、実行に時間がかかると仮定します。私は関数f2()を実行するためにプロセッサxを中断する効率的な方法を見つけたいと思いますし、f2()の実行後にf1()を中断してから実行します。私が望むものではありませんが、f1_procの作成者が[interrupt、f1_terminatedなどのメッセージを待つ間、f1()をプロセッサ(名前f1_proc)で実行させることです。 f2()が実行されます。Erlangでのプロセスの中断

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

答えて

2

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

+0

ありがとう!これは答えがいかにであるべきであるかである。(私はそれであなたを信頼するつもりだ)。 – AJed

0

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

erlang hibernate commandを使用してください。真上ドキュメントリンクから :

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つを一時停止し、それ以外の作業を続けます。


ご利用の場合は、質問にはそれほど明確ではないですが、あなたも(Infactはそれ以上)の両方を持つことができ、互いを待つことなく、並列に動作するプロセス、およびプロセスは、それはだ終わった後も通知取得ジョブ。

+0

これは私が探しているものではありません。申し訳ありません – AJed

0

これを行う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 &トンプソン(オライリー)によってブックアーランプログラミングをお勧めします。本書では、メッセージの受け渡しと並行性について知っておく必要がある、詳細な例と優れた例を網羅しています。