4

呼び出します!あるアクターから別のワーカーアクターへのメソッドは、呼び出し元が応答を受信した後でもチャネルを開いたままにしているように見えます(つまり、futureの準備ができています)。

たとえば、!!を使用します。あるアクターから別のワーカーアクターに11の異なるメッセージを送信すると、元の呼び出し元のメールボックスに次のような11のメッセージが表示され、それぞれのChannel@xxxx値が異なります。

!(scala.actors.Channel@11b456f,Exit(com.test.app.actor.QueryActor@4f7bc2、'normal))

これらのメッセージは、元の呼び出し元がexit()への独自の呼び出しでExitメッセージを送信しているため、ワーカーからの応答を待っていますか、それとももう一方の端で生成され、何らかの理由で上記の印刷フォームがありますか?この時点で、ワーカーアクターはすでに終了しているため、元の呼び出し元は!! 絶対に返信を受け取ることはありません。

元の呼び出し側アクターのメールボックスがこれらの終了メッセージでいっぱいになるため、この動作は望ましくありません(!!が使用されるたびに作成されたチャネルごとに1つ)。

どうすればこれを止めることができますか?元の発信者は、それぞれに作成された応答チャネルに自動的に「リンク」していますか?電話?

4

1 に答える 1

5

これらの終了メッセージが元の呼び出し元に送信される理由は、呼び出し元が、将来の結果を受信するために使用される一時チャネルを呼び出し先にリンクしているためです。特に、チャネルが終了シグナルを受信すると、そのチャネルで終了メッセージが送信され、実際の呼び出し元に送信されると説明したものと同様のメッセージが生成されます (チャネルはメッセージのタグと考えることができます)。これは、呼び出し先が将来のメッセージ送信を処理する前に終了した場合に、呼び出し元内で例外を (再) スローできるようにするために行われます (例外は、未来へのアクセス時にスローされます)。

現在の実装の問題は、フューチャーが既に解決されている場合でも、呼び出し元が終了メッセージを受け取ることです。これは明らかにバグであり、Scala Trac に報告する必要があります。可能な修正は、将来がまだ解決されていない場合にのみ終了メッセージを送信することです。この場合、apply または isSet を使用して初めて Future にアクセスするたびに、Exit メッセージが削除されます。

于 2010-02-24T12:58:47.653 に答える