1

私は無害多くfuture Sを観察する方法を見つけようとしています。これにより、N個のスレッドをブロックせずにN futureを待つことを意味します。は、私が行く/ clojure.core.asyncにおける先物/約束をDEREFすることはできますか?

私はcore.asyncライブラリは、それがブロック操作でスレッドをブロックしない方法で構築するのではなく、それを駐車し、スレッドを再利用していることがわかります。それはDEREFの場合である、またはそれは<!alts!でのみ動作しますか?

+0

あなたのタイトルは、移動ブロックでこれを行う方法を尋ねているように聞こえます。あなたは、未来のためにこれを行う方法を求めているように聞こえるように聞こえるように聞こえます。あなたは何を探していますか?私は*スレッド*で終わらない方法を探してい –

+0

@ArthurUlfeldtはDEREFを待っによってブロックされています。 – desudesudesu

+0

クロージャーの先物を使わなければなりませんか?私は現実世界での使用にまったくかかりません。 'ztellman/manifold'ライブラリなどの他の手段を使用してください。 – ClojureMostly

答えて

2

future-done?関数が見する準備ができているどれ見るために先物の配列をポーリングするために使用することができます。

main> (future-done? (future 42)) 
true 
main> (future-done? (future (Thread/sleep 1000) 42)) 
false 

あなたがしてポーリングし、おそらくすべての先物(ベクトル内の関数を作成することができます)仕事をしてから仕事をします。代わりに上の各将来のスレッドをブロックするこの方法は、あなたがそれになりたい場合は

(一般的な選択がある時に1)を、あなたはどの将来のスレッドをブロックし、あなたが望むどのように多くのそのような労働者を決めますより効率的で表現力があります。これは、あなたが自分のバージョンclojure.core.async/alts!を作り直す道を踏み出し、core.asyncをずっと使いこなす方がいいかもしれないことを確認して作業する先物を追跡するための状態マシンを作成するでしょう。

+0

ので、最善のアプローチは、常にあなたは、彼らが行われているか否かを持っているすべての先物をチェックする別のスレッドを使用している可能性が?それが動作している間、それは何とかきれいなソリューションとして見えません。 – desudesudesu

+0

がこの質問への回答を質問に追加しました –

関連する問題