問題タブ [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.
c# - C# のアクターの適切な実装はありますか?
.net/c#のアクター同時実行モデルの適切な実装はありますか?
私は ac# ルーチンを最適化する必要があり、アクター モデルは私の問題の解決策として完全に適合すると思います。残念ながら、私はスカラ実装の経験しかありません。
scala - 奇妙な動作: Scala Actors 2.7.7 と 2.8-Snapshot
私は 18 歳の研修生で、大好きな scala を発見しています :-)。scala アクターに慣れるために、いくつかのギアと 1 つのコントローラーを使用した小さなシミュレーションを作成しました。ActorApplication は、ランダムな速度で N 個の歯車を作成します。コントローラは同期速度を計算し、ギア アクターを開始します。ギアは、この特定の速度に段階的に同期します (1+ または 1-)。すべてのギアが同期速度に達した時点で、シミュレーションは終了します。scala 2.7.7 でシミュレーションを開発しましたが、期待どおりに動作しました (以下の出力を参照)。しかし、現在の 2.8.0-SNAPSHOT に切り替えたところ、奇妙な動作を発見しました。これはコードです:
上記のコードは、scala 2.7.7 で次のような出力を生成します。
さまざまなアクター (ギアとコントローラー)の交互の出力を見ることができます。しかし、scala 2.8 に変更すると、次のような出力が得られます。
アクター間の交互作用がはるかに少ないことがわかります。ギアが動作している間、コントローラーがブロックされていると思われます。誰かがこの動作を説明できますか? ありがとうフィリップ
concurrency - F# は、プロセスのスポーンとキルにおいて、Erlang よりも本当に高速ですか?
更新: この質問には、ベンチマークを無意味にするエラーが含まれています。F# と Erlang の基本的な同時実行機能を比較するより良いベンチマークを試み、別の質問で結果を調べます。
Erlang と F# のパフォーマンス特性を理解しようとしています。Erlang の並行性モデルは非常に魅力的ですが、相互運用性の理由から F# を使用する傾向があります。すぐに使用できる F# は、Erlang の同時実行プリミティブのようなものを提供しませんが、async と MailboxProcessor は、Erlang がうまく機能することのごく一部しかカバーしていないことがわかります.F# のパフォーマンスで何が可能かを理解しようとしています。賢い。
Joe Armstrong の Programming Erlang の本で、彼は Erlang ではプロセスが非常に安価であると主張しています。彼は、(大まかに) 次のコードを使用して、この事実を示しています。
私の Macbook Pro では、10 万のプロセス ( processes:max(100000)) を生成して強制終了するには、プロセスごとに約 8 マイクロ秒かかります。プロセスの数をもう少し増やすことはできますが、100 万を超えるとかなり一貫して問題が発生するようです。
F# をほとんど知らないので、async と MailBoxProcessor を使用してこの例を実装しようとしました。間違っている可能性がある私の試みは次のとおりです。
Mono で F# を使用すると、100,000 個のアクター/プロセッサの起動と停止にかかる時間はプロセスあたり 2 マイクロ秒未満で、Erlang よりも約 4 倍高速です。さらに重要なのは、何百万ものプロセスに問題なくスケールアップできることです。100 万または 200 万のプロセスを開始するには、プロセスごとに約 2 マイクロ秒かかります。2000 万のプロセッサを起動することはまだ可能ですが、プロセスあたり約 6 マイクロ秒まで遅くなります。
F# が async と MailBoxProcessor を実装する方法を完全に理解するにはまだ時間がかかりましたが、これらの結果は心強いものです。私がひどく間違っていることはありますか?
そうでない場合、Erlang が F# よりも優れている可能性が高い場所はありますか? Erlang の同時実行プリミティブをライブラリを介して F# に持ち込めない理由はありますか?
編集: ブライアンが指摘したエラーのため、上記の数値は間違っています。修正したら、質問全体を更新します。
python - ブロッキングチャネルと非同期メッセージパッシング
「メッセージパッシング」には2つの方法があることに気づきました。1つはErlangの使用を確認し、もう1つはStacklessPythonからのものです。私が理解していることから、ここに違いがあります
Erlangスタイル-メッセージが送信され、受信プロセスのメールボックスにキューに入れられます。そこから、FIFOベースで削除されます。最初のプロセスがメッセージを送信すると、続行できます。
Pythonスタイル-プロセスAはプロセスBに送信するためにキューに入れられます。Bは現在他のアクションを実行しているため、Bが受信する準備ができるまでAはフリーズします。Bが読み取りチャネルを開くと、Aはデータを送信し、両方とも続行します。
これで、Erlangメソッドの長所は、ブロックされたプロセスがないことです。Bが受信できない場合でも、Aは続行できます。しかし、私が書いたいくつかのプログラムでは、メッセージの流入が流出よりも多いため、Erlangメッセージボックスが数百(または数千)のメッセージでいっぱいになる可能性があることに気づきました。
今、私はどちらのフレームワーク/言語でも大きなプログラムを書いたことがないので、あなたの経験はこれであるのだろうかと思います。
はい、私はこれが抽象的なことを知っていますが、私はかなり抽象的な答えも探しています。
sql - データベースに接続すると、ScalaActorsが予期せず中断します
Scalaの標準アクターライブラリの理解に問題があります。以下のコードでは、単純なスイングを作成しました。これは基本的に、postgreSQLサーバーに接続できるかどうかをテストする必要があります。ただし、それほど遠くはありません。データベースへの接続に必要な作業を実行しているときにUIがフリーズするため、アクターを使用します。この行を使用する場合(つまり、単一のスレッドではなくアクターを使用します)
Swingは更新されません。ただし、その行をコメントアウトして、次の3行を使用するとします。(アクターが使用されないことを意味します)
スイングはフリーズしますが、約25秒後にスイングが更新されます。
scala - Scalaアクター:JRE1.5と1.6での異なる動作
私のシミュレーションでは、アクターとScala2.8-スナップショットを使用しています。Java JRE 1.5では、正常に動作します。40個のギア(アクター)すべてが同時に動作しています。Java JRE 1.6を使用すると、3つのギアのみが同時に動作します。GUIを使用してテストした場合と使用しない場合でテストしました。どちらも同じ結果になります。
GUIを使用したシミュレーションは、githubで入手できます:http://github.com/pmeiclx/scala_gear_simulation
多分あなたは俳優との私の最初の問題を覚えています。これらの問題を解決した後、シミュレーション用のGUIを実行し、この新しい「奇妙な」動作を取得しました。
GUIを使用しないコードは次のとおりです。
scala - 通常の終了動作を妨げることなく、既存のプログラムにscalaアクターを追加するにはどうすればよいですか?
このプログラムは、main()を実行した後、終了しません。
この予期しない副作用のために、アクターの使用は煩わしいと見なされる可能性があります。
アクターがプログラムの終了まで実行し続ける必要があると仮定すると、終了のすべての場合に元の動作を維持するにはどうすればよいですか?
scala - Scalaでアクターを使用するときに同時実行を制限するにはどうすればよいですか?
私はJavaから来ており、スレッドプールに支えられたRunnablesを送信します。ExecutorServiceJavaでは、スレッドプールのサイズに制限を設定する方法は非常に明確です。
Scalaアクターの使用に興味がありますが、並行性を制限する方法がわかりません。
仮に、「ジョブ」を受け入れるWebサービスを作成しているとしましょう。ジョブはPOSTリクエストとともに送信されます。サービスでジョブをキューに入れてすぐに返すように202 Acceptedします。つまり、ジョブは非同期で処理されます。
アクターを使用してキュー内のジョブを処理している場合、処理される同時ジョブの数を制限するにはどうすればよいですか?
これに取り組むためのいくつかの異なる方法を考えることができます。コミュニティのベストプラクティスがあるのか、少なくとも、Scalaの世界である程度標準的な明確に確立されたアプローチがあるのか疑問に思います。
私が考えたアプローチの1つは、ジョブキューとジョブ処理アクターを管理する単一のコーディネーターアクターを持つことです。単純なintフィールドを使用して、現在処理されているジョブの数を追跡できると思います。ただし、エラーが発生したときに追跡して数を減らすなど、そのアプローチにはいくつかの落とし穴があると確信しています。だから私は、Scalaがこれに対してもっと単純な、あるいはもっとカプセル化されたアプローチをすでに提供しているのだろうかと思っています。
ところで、私は少し前にこの質問をしようとしましたが、私はそれをひどく尋ねました。
ありがとう!
erlang - Erlang では、登録されたプロセスを使用することは、伝統的な言語のグローバル変数とどのように異なりますか?
私にはそれらは同じもののように見えますが、登録されたプロセスが「アクター」という用語で偽装されているだけです。
アップデート:
それ以来、私は自分の考え方に誤りがあることに気づきました。私はErlangに慣れていないので、アクターがまったく属していない場所でアクターを使用していたと思います(これのアンチパターン名はどこかにありますか?)
erlang - Erlang で、メッセージの送信者が応答を待つ方法はありますか?
Erlang では、メッセージの送信者が応答を待つことができる方法はありますか? そのため、メッセージが処理された後にのみ実行を継続しますか?
そして、私は次のようなことを意味します:
送信者の Pid を送信することでコールバックを行うことができることは知っていますが、他に待機する方法はありますか?