問題タブ [future]
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の「Future」がガベージコレクションされるとどうなりますか?
計算するのにStreamかなり費用がかかるとしましょう。次のように書くだけで、「先に計算する」スレッドを簡単に作成できます。
次に、これへの参照を破棄Futureすると、そのスレッドはガベージコレクターによって強制終了されますか?
java - Future.cancel(false)のユースケース?
falseどのような状況でmayInterruptIfRunningパラメータをに渡したいFuture.cancel()ですか?
私が正しく理解していれば、合格falseしてタスクがキャンセルされたがスレッドが中断されていないExecutionException場合、タスクはまだキャンセル済みとしてマークされているため、結果(または)にアクセスすることはできません(つまり、isCancelled()戻りtrue、get()スローしCancellationExceptionます)。
その他の考えられる状況は次のとおりです。
Runnableまたは実装は割り込みをチェックせず、Callable割り込みを行っても完了まで実行されます(ここでは割り込みは違いがありません)- 電話をかける前にすでに完了したタスク
cancel()(ここでも割り込みは違いはありません) - タスクは、終了する前にクリーンアップを実行する必要があります(適切に記述された実装が
try ... finallyこれに使用されます)。 - タスクはすぐに終了することはできず、I / Oのブロックなど、割り込みの影響を受ける操作を実行し続ける必要があります(この場合、おそらくまったく呼び出さない
cancelでください) 。
では、いつ/なぜタスクを中断せずにキャンセルするのでしょうか。
java - View で使用する @Asynchronous 関数の現在の進行状況を公開する
私の JEE6-App (Glassfish 3.0.1 で実行) には、大量のメールを送信する必要がある EmailEJB があります。メールは非同期で送信されるため、新しい EJB3.1 @Asynchronous で注釈が付けられ、別のスレッドで実行できます。ここで、メソッドの現在のステータスについてユーザーに通知する必要があります。すでに送信されたメールの数は?
メールの非同期送信は正常に機能しますが、進行状況を外部からアクセスできるようにする方法がわかりません。それを行うための私のアプローチはかなり間違っているようですが、どういうわけかそれが可能でなければなりません(おそらく別のアプローチ)。これは私の EmailEJB が現在どのように見えるかです (疑似コードのようなものですが、私が望むものを説明しています):
リターンでキャンセルせずに、非同期関数内で現在の進行状況を返すにはどうすればよいですか? 関数内のループの進行状況をユーザーに表示するにはどうすればよいですか? 別の非同期メソッドが必要ですか? ヒントはありますか?
scala - 複数のリモート アクターで複数の先物を使用すると、プログラムがハングする
1 つのホストで 2 つのリモート アクターを開始し、送信されたものをすべてエコーします。次に、( !! を使用して) いくつかのメッセージを両方のアクターに送信する別のアクターを作成し、これらのアクターからの応答を保持する Future オブジェクトのリストを保持します。次に、この List をループして、各 Future の結果をフェッチします。問題は、アクターが応答を送信したと主張しているにもかかわらず、ほとんどの場合、一部の先物が返されないことです。問題はランダムに発生し、リスト全体を通過することもありますが、ほとんどの場合、ある時点でスタックして無期限にハングします。
私のマシンで問題を引き起こすコードは次のとおりです。
Sink.scala:
ソース.scala:
私は何を間違っていますか?
scala - Scalaアクターと非アクターの相互作用(またはアクターからサーブレットへのメッセージの同期)
私は次のscalaコードを持っています:
上記のコードでは、更新するのにthread.sleep十分な時間を確保するために使用する必要があります。そうしないと、が返されます。使用せずにこれを行うためのよりエレガントな方法は何ですか?私は先物を使わなければならないと思いますが、その概念に頭を悩ませることはできません。各HTTP要求が一意の乱数を取得するようにする必要があります(もちろん、乱数は問題を説明するためだけのものです)。いくつかのヒントや参考資料をいただければ幸いです。result0thread.sleep
java - キャンセルされた未来が実際に終わるのを待っている
SwingWorkerスレッドの中断をチェックしないコードを呼び出す があります。の呼び出し後worker.cancel(true)、worker.get()メソッドはすぐにスローCancellationExceptionします (想定どおり)。ただし、バックグラウンド タスクのコードは、そのスレッドが中断されるかどうかを決してチェックしないため、喜んで実行を継続します。
バックグラウンド タスクが実際に終了するまで待機する標準的な方法はありますか? 「キャンセル中...」メッセージまたはそのようなものを表示して、タスクが終了するまでブロックしたいと考えています。(必要に応じて、他の解決策を探すだけで、ワーカー クラスのフラグを使用して常にこれを達成できると確信しています。)
haskell - Haskell の先物
Haskell には、変数を未来にバインドする Alice の機能と同等のものがありますか?
ここで、foo は何らかの関数です。
Haskell がチャネルとスレッドをサポートしていることは知っています。Alice の構文と同じくらい自然な構文で、値を未来にバインドし、スレッドを生成して詳細を処理することなくそれを計算することを望んでいます。
multithreading - なぜ私のscala先物はより効率的ではないのですか?
私はこのscalaコードを32ビットのクアッドコアCore2システムで実行しています。
(はい、一連の整数を合計するためのはるかに効率的な方法があることを私は知っています。それは、CPUに何かを与えるためだけです)。
JOBSの設定に応じて、コードは次の時間に実行されます。
これが「インプレー」の2つの先物を超えて実際に拡張できないことに驚いています。私は多くのマルチスレッドC++コードを実行しており、この種のコードをIntelのTBBでコーディングした場合、またはboost::threads(もちろん、かなり冗長になる) 、4コアまでのスケールアップが良好で、CPU使用率が390%を超えることは間違いありません。 )。
だから:何が起こっているのか、そしてどうすれば私が期待する4コアへのスケーリングを得ることができますか?これはscalaまたはJVMの何かによって制限されていますか?私は実際に「どこで」scalaの先物が実行されるのかわかりません...先物ごとに生成されるスレッドですか、それとも「Futures」はそれらを実行するための専用のスレッドプールを提供しますか?
[sun-java6(6-20-0lennny1)を搭載したLennyシステムでDebian/Squeezeのscala2.7.7パッケージを使用しています。]
アップデート:
Rexの回答で示唆されているように、オブジェクトの作成を回避するために再コーディングしました。
これは非常に高速で、任意の時間実行するために反復回数を大幅に増やす必要がありました。結果は次のとおりです。
これは、私が見たいと思っているものに非常に似ています(ただし、3つのジョブのケースは少し奇妙で、1つのタスクが他の2つのタスクの数秒前に一貫して完了します)。
さらに少し推し進めると、クアッドコアハイパースレッドi7では、後者のバージョンではJOBS=8JOBS = 1に対してx4.4のスピードアップが達成され、CPU使用率は571%になります。
java - ExecutorServiceによって生成された結果を消費します。どのクラス?
クラス/インターフェース名を書き留めておけばよかったのですが、書き留めていませんでした...
JDK javadocsを調べたときに、ExecutorService(完了したFutures<T>s)によって生成された結果を収集して消費することを目的とした、おそらくシステムの他の場所でのクラス/インターフェースへの参照を見つけました。当時は必要なものにぴったりだったので心に留めていましたが、クラスの名前がわからなくなってしまいました。
誰かが私が何を指しているのか考えていますか?
scala - 先物に反応する
分割統治(別名フォーク/結合)アプローチを使用して、数値計算の問題を解決しようとしています。コードは次のとおりです。
それは(素晴らしいスピードアップで)実行されますが、将来のapplyメソッドはスレッドをブロックしているようで、スレッドプールは大幅に増加します。また、作成されるスレッドが多すぎると、計算がスタックします。
スレッドを解放する先物の一種の反応方法はありますか?または、その動作を実現する他の方法はありますか?
編集:私はscala2.8.0.finalを使用しています