問題タブ [actor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - シングルスレッドキューとしての Scala アクター
一部のアクターをキューであるかのように扱うことに関して何らかの制限があるプログラムでアクターを使用したいと思います。たとえば、変更イベントが適用される外部システムと、外部システムのデータのキャッシュがあるとします。だから私は2人の俳優を持っています:
ChangeApplicationActor
CacheActor
の一部として、外部システムのChangeApplicationActor
エンティティに変更を適用するときに、イベントを送信して に同期X
するよう伝えたいと考えています。CacheActor
しかし、私には2つの要件があります。
- には内部状態があり、理想的にはその命令を順番
CacheActor
に処理したいSync
- の同じ値に対する
CacheActor
2 つの命令を含む の受信トレイになってしまった場合、2 番目の命令は無視したいと思います (つまり、 の任意の値に対して保留中の命令は 1 つだけにする必要があります) 。Sync(x)
x
Sync
x
アクターを強制的にシングルスレッドにする方法はありますか? アクターのメールボックスにアクセスして、重複したイベントを削除する方法はありますか? CacheActor
as, um, not an Actorの実装を避けることはできませんか?
scala - Scala アクターは複数のメッセージを同時に処理できますか?
私の最近の質問への回答は、攻撃者が一度に 1 つずつメッセージを処理したことを示していました。これは本当ですか?次のスニペットを含む ( Scalaでのプログラミングで) 明示的に言っているものは何もありません(pp. 593)
[
react
メソッド] が処理可能なメッセージを見つけた場合、[メソッド] は後で実行するためにそのメッセージの処理をスケジュールし、例外をスローします。
(私自身を強調してください)。2 つの関連する (そして相互に排他的な) 質問:
- アクターが複数のメッセージを同時に処理できると仮定すると、アクターにメッセージを一度に 1 つずつ処理させるにはどうすればよいでしょうか (これがやりたい場合)。(
receive
?) - アクターが一度に 1 つずつメッセージを処理すると仮定すると、実際にメッセージを同時に処理できるアクターをどのように実装するのが最善でしょうか?
編集: 少しテストを行うと、私が間違っていて、アクターが実際にシーケンシャルであることがわかります。それで、私が答える必要があるのは質問#2です
scala - Scalaで同時に処理する
私自身の質問に対する私自身の答えのように、私はキューに到着する多数のイベントを処理している状況にあります。各イベントはまったく同じ方法で処理され、他のすべてのイベントとは独立して処理することもできます。
私のプログラムはScala並行性フレームワークを利用しており、関連するプロセスの多くはActor
sとしてモデル化されています。はメッセージを順番に処理するため、このActor
特定の問題にはあまり適していません(他のアクターが順番にアクションを実行している場合でも)。Scalaにすべてのスレッド作成を「制御」させたいので(そもそも並行性システムを持っているという点だと思います)、2つの選択肢があるようです。
- 私が管理しているイベントプロセッサのプールにイベントを送信します
Actor
他のメカニズムでそれらを同時に処理するように指示します
#1は、アクターサブシステムを使用するポイントを否定すると思います。プロセッサーアクターをいくつ作成する必要がありますか?1つの明白な質問です。これらのことはおそらく私から隠されており、サブシステムによって解決されています。
私の答えは次のことをすることでした:
より良いアプローチはありますか?これは間違っていますか?
編集:おそらくより良いアプローチは次のとおりです:
scala - Scala の Actor フレームワークは、スタックの問題なしに 10.000 のアクターを処理できますか?
Scala Actor フレームワークを使用して、約 10.000 のエージェント (マシンおよび製品エージェント) を含むマルチエージェント シミュレーションを実行したいと考えています。
私が理解しているように、多くのアクターがメッセージを渡している場合、再帰のためにスタックが不足する可能性がありますか?
その場合、基になるワーカー スレッドのスタック サイズを増やすにはどうすればよいですか?
scala - Scala アクターのプロパティを @volatile とマークする必要がありますか?
Scala では、次のような単純なクラスがあるとします。
フィールドsum
にマークを付ける必要があり@volatile
ますか? アクターは論理的にシングルスレッド(つまり、メッセージが順次処理される) ですが、個々の反応は別々のスレッドで発生する可能性があるため、state
変数が 1 つのスレッドで変更され、別のスレッドから読み取られる可能性があります。
scala - クロック ドリブン マルチエージェント シミュレーションの設計方法
実際の製造プロセスのマルチエージェント シミュレーション モデルを作成して、ディスパッチ ルールを評価したいと考えています。シミュレーションでは、実際の製造イベント ログと比較してディスパッチ ルールの時間効果を評価するために、イベント ログを生成する必要があります。
「現在のシミュレーション時間」を、この種のマルチエージェント、メッセージ パッシングの集中的なシミュレーションにどのように組み込むことができますか?
背景:
システム内のエージェントは比較的複雑な動作とルーティング要件を表し、ディスパッチ ルールでは頻繁に通信する必要があるため、(時間の進行を適切に処理する) 古典的な離散イベント シミュレーションはここでは適用できません。このプロセスやその他のプロセスの複雑さにより、集中型のスケジューリング アプローチも除外されます。
製造科学では、製造関連の問題を解決するためにマルチエージェント シミュレーションを使用した何千もの論文があります。ただし、これらのシミュレーションの内部の仕組みや実装の詳細を必要な詳細で説明している論文をまだ見つけていません。
残念ながら、プロセス時間の範囲が 0.1 秒から 24 時間の間であるため、システム内の離散時間ステッピングに最短のプロセス時間を使用することは実行不可能な場合があります。私のシミュレーションは後でプロジェクトの what-if 評価に使用される可能性があるため、シミュレーションをできるだけ速く実行する必要があります。夜間のシミュレーション実行のオプションはありません。
問題のサイズは、約 500 のリソースと 1000 から 10000 の製品エージェントであり、それらのほとんどは終了しており、それ以上のコミュニケーションやリソース占有に参加していません。
その結果、コミュニケーションの結果として、新しいイベントは、元の「次回」イベントが到着する前に、エージェントが何かを行うようにトリガーできます。たとえば、エージェントは現在、1 時間続くリソースでブロックされています。ただし、優先度の高い別のエージェントがすぐにそのリソースを必要とし、最初のエージェントにそのリソースを解放するように依頼します。
ある意味では、従来のメッセージ パッシング エージェント シミュレーションと離散イベント シミュレーションのハイブリッドを作成する方法が必要です。
私は、すべてのメッセージに関与するメディエーター エージェント (メッセージ ルーターと、メッセージとタイマー ティック イベントを送信するタイム エンフォーサー) を考えました。また、メディエーター エージェントは、さまざまなエージェントの次のイベント時間のリストを保持します。しかし、この概念はメディエーター エージェントに大きなプレッシャーを与えるため、問題を解決するためのより良い方法があるはずだと感じています。
アップデート
少し時間がかかりましたが、なんとかミニフレームワークを作成し、DES とエージェントの概念を 1 つにまとめることができたようです。新しいものではないと確信していますが、少なくともユニークです: http://code.google.com/p/tidra-framework/興味がある場合。
scala - アクターではないものからアクターにメッセージを送信するのは悪い習慣ですか?
actor_
タイプのプロパティを持つクラスがあるとしますActor
。私がやっていることに問題がありますか
または、メッセージの送信は常に別のアクターから行う必要があります。例えば
scala - リモート アクターを特定するにはどうすればよいですか?
別のリモート アクター (サーバー) に登録し、後で (シャットダウン フックを使用して) 登録を解除するリモート アクター (クライアント) があります。ただし、サーバーは登録解除を取得しますが、実際のsender
プロパティは別の Channel オブジェクトです。私のサーバーログには次のものがあります:
Registered new client [scala.actors.Channel@158e282]; supporting 1 clients
De-registered client [scala.actors.Channel@1caf0b6]; supporting 1 clients
これが最初に登録したのと同じクライアント アクターであることを (サーバー側で) どのように判断できますか? 明らかに、各クライアントに独自のUUID
ものを吹き込むことができますが、もっと簡単な方法があるのだろうか?
scala - もう存在しないクライアントに書き込もうとすると、リモート アクター フレームワークは何をしますか?
リモート アクター フレームワークを使用して複数のクライアントと通信するサーバーがあります。この質問で述べたように、クライアントがいつ姿を消したのかを追跡するのに苦労しています。したがって、私のサーバーはまだ存在しないクライアントにメッセージを送信しようとしています。
- これは問題ですか?(例外がスローされることはありませんが、サーバーの寿命が長い場合はメモリの問題があると思います)
- メッセージがリッスンしていないクライアントに送信されていることを検出するにはどうすればよいですか? (何らかの接続クリーンアップを実装したい場合)
scala - Scala はどのようにケース クラスに欠落している引数を "埋める" のですか?
私が電話するとき:
これはどのように次の構造に変換されますか:
特に、リモート (サーバー) アクターに渡されたリモート (クライアント) アクターからこれを呼び出すと、サーバーはプロパティがアクターでlink
あるインスタンスを受け取ることになります。Exit
from
基本的に、このリモート クライアント アクター オブジェクトのハンドルを取得する方法を理解したいと思います!