問題タブ [concurrency]
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.
java - ExecutorService のアクティブなスレッド
で現在実行されているアクティブなスレッドの数を判断する方法はありExecutorService
ますか?
perl - Windows で Perl ithreads を同時に実行できますか?
Perl スレッド (スレッドを使用) を使用してセットアップしようとしている Perl スクリプトがあります。簡単なテストを実行するとすべてが機能しますが、実際のスクリプト (複数の SQL Plus セッションを実行するスレッドを含む) を実行すると、各 SQL Plus セッションが順番に実行されます (つまり、スレッド 1 の sqlplus がステップ 1 から 5 を実行し、次にスレッド 2 の sqlplus が実行されます)。手順 6 ~ 11 などを実行します)。
スレッドが並行処理を行うことは理解できたと思いましたが、何かがおかしいです。アイデアはありますか、それとも他の Perl マジックを行う必要がありますか?
concurrency - コンカレント プライム ジェネレーター
私は projecteuler.net の問題を解いて Erlang でのプログラミング方法を学んでいますが、200 万未満の素数をすべて 1 分以内に作成できる素数ジェネレータを作成するのに最も苦労しています。シーケンシャル スタイルを使用して、エラトステネスのふるいを含む 3 種類のジェネレーターを既に作成しましたが、どれも十分に機能しません。
並行 Sieve がうまく機能すると考えましたが、bad_arity メッセージが表示され、その理由がわかりません。なぜ私が問題を抱えているのか、または適切にコーディングする方法について何か提案はありますか?
これが私のコードです。コメントアウトされたセクションは、私が物事を並行させようとした場所です:
java - 分散同時実行制御
私はこれに数日間取り組んできましたが、いくつかの解決策を見つけましたが、どれも信じられないほど単純でも軽量でもありませんでした。問題は基本的に次のとおりです。10 台のマシンのクラスターがあり、それぞれがマルチスレッド ESB プラットフォームで同じソフトウェアを実行しています。同じマシン上のスレッド間の同時実行の問題はかなり簡単に処理できますが、異なるマシン上の同じデータに対する同時実行の問題はどうでしょうか?
基本的に、ソフトウェアは Web サービスを介して顧客のデータをある企業から別の企業にフィードする要求を受け取ります。ただし、顧客が他のシステムに存在する場合もあれば、存在しない場合もあります。そうでない場合は、Web サービス メソッドを介して作成します。したがって、ある種のテスト アンド セットが必要ですが、他のマシンが競合状態を引き起こさないようにロックアウトするための何らかのセマフォが必要です。以前、1 人のローカル カスタマーに対してリモート カスタマーが 2 回作成されたという状況がありましたが、これはあまり望ましくありません。
私が概念的にいじった解決策は次のとおりです。
フォールト トレラントな共有ファイル システムを使用して、お客様に応じて各マシンでチェックされる「ロック」ファイルを作成します。
データベースで特別なテーブルを使用し、ロック レコードの「テストと設定」を行うためにテーブル全体をロックします。
スケーリングを支援するオープン ソース サーバー ソフトウェアである Terracotta を使用しますが、ハブ アンド スポーク モデルを使用します。
メモリ内の「ロック」の同期レプリケーションに EHCache を使用します。
この種の問題を経験したことがあるのが私だけだとは想像できません。どのように解決しましたか?社内で何か調理しましたか、それともお気に入りのサードパーティ製品はありますか?
java - HTTPサーブレットコンテナの最大スレッド数を選択するにはどうすればよいですか?
Jettyで(ブロッキングIOを使用して)サーブレットとして実行されるRESTfulWebサービスを開発しています。最大スレッドの最適な設定を見つけるのは難しいようです。
セットアップの残りの部分のいくつかの簡単に測定可能な特性からスレッドの最大数を決定するための研究された公式はありますか?
java - 複数のスレッドから java.util.HashMap から値を取得するのは安全ですか (変更なし)?
マップが構築される場合があり、一度初期化すると二度と変更されません。ただし、複数のスレッドから (get(key) のみを介して) アクセスされます。このように a を使用しても安全java.util.HashMap
ですか?
(現在、私は を喜んで使用しておりjava.util.concurrent.ConcurrentHashMap
、パフォーマンスを向上させる必要性は測定されていませんが、単純なもので十分かどうか単純に興味がありますHashMap
。したがって、この質問は「どちらを使用すべきか?」ではなく、パフォーマンスの問題でもありません。むしろ、問題は「安全かどうか」です)
c# - C# でのロック
私はまだ少し不明確で、コードをいつロックするかはわかりません。私の一般的な経験則は、静的変数の読み取りまたは書き込み時に操作をロックでラップすることです。しかし、静的変数が読み取り専用の場合 (たとえば、型の初期化中に設定された読み取り専用の場合)、それにアクセスするために lock ステートメントでラップする必要はありませんよね? 最近、次の例のようなコードをいくつか見たので、マルチスレッドに関する知識にギャップがあるのではないかと思いました。
それは私には意味がありません.なぜレジスタの読み取りに並行性の問題があるのでしょうか?
また、この例は別の問題を提起します。これらのうちの1つは他のものより優れていますか? (たとえば、例 2 では、ロックを保持する時間が短くなりますか?) MSIL を逆アセンブルできると思います...
対。
.net - .NETの同時スレッド間でデータを渡すための最良の方法は何ですか?
私には2つのスレッドがあり、1つは更新を探すために多数の個別の静的リソースをポーリングする必要があります。もう1つは、データを取得してデータベースに保存する必要があります。スレッド1は、処理するものがあることをスレッド2にどのように伝えることができますか?
java - いずれかの Future まで待機終わらせる
実行中の非同期タスクはほとんどなく、そのうちの少なくとも 1 つが終了するまで待つ必要があります (将来的には、N 個のタスクのうち util M 個が終了するのを待つ必要があるでしょう)。現在、それらはFutureとして提示されているため、次のようなものが必要です
このようなことはありますか?または同様のもの、Future には必要ありません。現在、先物のコレクションをループし、1 つが終了したかどうかを確認してから、しばらくスリープしてからもう一度確認します。これは最善の解決策ではないように見えます。長時間スリープすると不要な遅延が追加され、短時間スリープするとパフォーマンスに影響する可能性があるためです。
使ってみることができました
タスクが完了するとカウントダウンを減らして実行します
、しかし、未来の創造を制御する場合にのみ可能であることがわかりました。可能ですが、システムの再設計が必要です。現在、タスク作成のロジック (Callable を ExecutorService に送信する) は、どの Future を待つかの決定から分離されているためです。オーバーライドすることもできました
RunnableFuture のカスタム実装を作成し、タスクが終了したときに通知されるようにリスナーをアタッチし、そのようなリスナーを必要なタスクにアタッチして CountDownLatch を使用しますが、これは、使用する ExecutorService ごとに newTaskFor をオーバーライドする必要があることを意味します。 AbstractExecutorService を拡張しません。同じ目的で指定された ExecutorService をラップすることもできますが、Future を生成するすべてのメソッドをデコレートする必要があります。
これらの解決策はすべてうまくいくかもしれませんが、非常に不自然に見えます。次のような単純なものが欠けているようです
C#で。この種の問題に対するよく知られた解決策はありますか?
アップデート:
もともと私は Future の作成にまったくアクセスできなかったので、エレガントな解決策はありませんでした。システムを再設計した後、Future の作成にアクセスし、実行プロセスに countDownLatch.countdown() を追加できたので、countDownLatch.await() を実行すると、すべて正常に動作します。他の回答に感謝します。私は ExecutorCompletionService について知りませんでした。実際に同様のタスクで役立つ可能性がありますが、この特定のケースでは、一部の Future がエグゼキューターなしで作成されるため、使用できませんでした。実際のタスクはネットワーク経由で別のサーバーに送信されます。リモートで完了し、完了通知を受け取ります。
programming-languages - マルチコアと並行性 - 言語、ライブラリ、および開発手法
CPU アーキテクチャの状況が変わりました。マルチコアは、ソフトウェアの開発方法を変えるトレンドです。私は C、C++、および Java でマルチスレッド開発を行い、さまざまな IPC メカニズムを使用してマルチプロセス開発を行いました。スレッドを使用する従来のアプローチでは、高度な並行性をサポートするハードウェアを開発者が利用することは容易ではないようです。
並行アプリケーションを作成する際の従来の課題を軽減するのに役立つ言語、ライブラリ、および開発手法は何ですか? 私は明らかに、デッドロックや競合状態などの問題を考えています。設計手法、ライブラリ、ツールなども興味深いものであり、利用可能なリソースを実際に活用し、確実に利用できるようにします。安全で堅牢なスレッド化されたアプリケーションを作成するだけでは、利用可能なすべてのコアを確実に使用できるわけではありません。
私がこれまでに見たものは次のとおりです。
- Erlang : プロセスベース、メッセージパッシング IPC、「アクターの同時実行モデル」
- Dramatis : Ruby および Python 用の俳優モデル ライブラリ
- Scala : 同時実行サポートが追加された JVM 用の関数型プログラミング言語
- Clojure : アクター ライブラリを使用した JVM 用の関数型プログラミング言語
- Termite : Erlang のプロセス アプローチと Scheme へのメッセージ パッシングのポート
他に何を知っていますか、何が効果的で、何を見るのが面白いと思いますか?