問題タブ [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.
python - Pythonでの非同期APIの設計
(注:この質問は、APIの設計に関するものであり、実装方法に関するものではありません。つまり、APIのクライアントがここで見るものだけを気にし、それを機能させるために何をしなければならないかは気にしません。)
簡単に言えば、Pythonで明示的な先物(別名promise、別名deferred、別名tasks-名前はフレームワークによって異なります)の確立されたパターン(ある場合)を知りたいです。以下は、より詳細な説明です。
次のような単純なPythonAPIについて考えてみます。
これは同期バージョンです-回線がまだ利用できない場合はブロックされます。ここで、操作が完了したときに呼び出されるコールバックを登録できる、対応する非同期(非ブロッキング)バージョンを提供するとします。たとえば、単純なバージョンは次のようになります。
現在、他の言語やフレームワークでは、そのようなAPIに対して、既存の必須または少なくとも十分に確立されたパターンが存在することがよくあります。たとえば、バージョン4より前の.NETでは、通常、BeginReadLine
/EndReadLine
メソッドのペアを提供し、ストックIAsyncResult
インターフェイスを使用してコールバックを登録し、結果の値を渡します。.NET 4以降ではSystem.Threading.Tasks
、を使用して、すべてのタスク結合演算子(WhenAll
など)を有効にし、C#5.0async
機能に接続します。
別の例として、JavaScriptでは、これを標準ライブラリでカバーするものは何もありませんが、jQueryは、現在個別に指定されている「deferredpromise」インターフェースを普及させました。したがってreadLine
、JSで非同期を作成する場合は、名前を付けて、戻り値にメソッドreadLineAsync
を実装します。then
Pythonの土地で確立されたパターンがあるとすれば、それは何ですか?標準ライブラリを見ると、非同期APIを提供するいくつかのモジュールがありますが、それらの間に一貫したパターンはなく、「タスク」または「約束」の標準化されたプロトコルのようなものはありません。おそらく、人気のあるサードパーティのライブラリから派生できるパターンがいくつかありますか?
Twistedの(このコンテキストでよく言及される)Deferedクラスも見ましたが、汎用のpromise API用に過剰に設計されており、このライブラリの特定のニーズに適合しているようです。クライアントがアプリケーションで両方のライブラリを一緒に使用する場合、私たちの約束がうまく相互運用できるように、(それらに依存することなく)インターフェイスを簡単に複製できるもののようには見えません。直接依存することなくコピー(および相互運用)できる、このために明示的に設計されたAPIを備えた他の人気のあるライブラリまたはフレームワークはありますか?
java - Future-Instance のリスト
Future-Instances のリストをよりパフォーマンスの高いものに置き換えたいと思います。現在、ツリーをトラバースし、 Callable を送信して、ツリー内の各ノードの子孫ノードまたは自己ノードの数を決定しています。Future インスタンスをリストに保存し、必要に応じてリストから適切なノード数を取得します。
残念なことに、List を使用している軸は、すべての Future インスタンスが送信されるまで待機する必要があります。さらに、メインメモリの制限を超えてスケーリングしません:-/
おそらく、Google Guava と ListenableFuture を使用するのが適切でしょう。
編集:Futureが起動されるたびにFutureがリストに追加されるPropertyChangeListenerで実際に何かを構築すると思います。次に、CountDownLatch を 1 に設定し、リストに新しい Future が追加されるたびに countDown() を呼び出します。何かのようなもの:
次に doHasNext() で:
そしてリスナー:
それが機能するかどうかはわかりませんが、手遅れであり、CountDownLatch の使用方法を信用していません (上記のコードをテストしていません)。
編集:誰かが興味を持っている場合に備えて。CountDownLatch と List の代わりに、BlockingQueue を PropertyChangeListener の実装と組み合わせて使用しました。これは、優れた「クリーンな」ソリューションのようです。
よろしく、
ヨハネス
java - Akka /先物 -- Akka は、現在のスレッドまたはディスパッチャを使用して「価値がある」かどうかを判断しますか?
現在、Akka (Java API/ライブラリ) を使用して、複数Future
の を作成し、BlockingQueue
. Callables によって処理される一部のタスクは、新しい Thread を作成したり、新しい Thread が使用可能になるのを待ったりする代わりに、呼び出しスレッドで実行する方が高速である可能性があります。たとえば、実行している場合、Akkaはまさにこれを行っていると思います:
future(Callable) を呼び出す現在のスレッドで実行される可能性がありますか、それとも間違っていますか? 新しいスレッドが作成されたかどうかをディスパッチャーがどのように判断するかがわからないため、間違っている可能性があります。
現在、私は他のスレッドを使用する ExecutorService を使用していますが、一部のタスクは非常に高速であるため、現在のスレッドで処理することもできます。しかし、私は a を使用してBlockingQueue<Future<Float>>
いるため、 s を使用できない場合と使用できない場合がありますFuture
。
よろしく、
ヨハネス
c++ - パラメータを使用して packaged_task を作成するにはどうすればよいですか?
futures、promise、およびパッケージ化されたタスクに関するこの優れたチュートリアルに従って、自分のタスクを準備したいと思うようになりました。
gcc-4.7.0 エラーメッセージを解読できる限り、引数が異なると予想されますか? しかし、どのように?エラーメッセージを短くしようとしました:
私のバリアントは、パラメーターをackermann
間違って提供する方法ですか? それとも間違ったテンプレートパラメータですか? 3,11
スレッドの作成にパラメータを与えませんよね?
失敗した他のバリアントを更新します。
うーん...それは私ですか、それともbeta-gccですか?
java - future.getは、キャンセル時にCallableで最終的に実行される前に戻ります
フューチャーがキャンセルされたときに、Callableでfinallyブロックが実行される前に、future.get呼び出しが返される場合に断続的に失敗するテストがあります。基本的なワークフローは次のとおりです。
future.cancel(true);
私はInterrupedException
投げられたのを見るCallable
メインスレッドは呼び出しCancellationException
からキャッチしますfuture.get
今Callable
呼び出しfinally
。
テストは私のノートブックでは常に成功し、ビルドサーバーではほとんどの場合失敗します。私のノートブックとビルドサーバーの両方がOpenJDK1.7を実行しています。何か案は?
scala - リストの並列化に akka フューチャーとアクターを使用する
メッセージのリストをアクターに送信し、将来すぐに返信を受け取り、すべての先物が完了するのを待ってから呼び出し元のメソッドに戻りたいと考えています。akka docs を読むと、Future.sequence が最適だと思いますが、次のコードを正しく動作させることができませんでした。コンパイラから次のエラーが表示されます。
明らかな何かが欠けていると確信していますが、例と API ドキュメントによると、以下のコードは「正しい」ようです。
一連のメッセージをアクターに送信し、未来を受け取り、すべての未来が完了したら戻る正しい方法は何ですか (オプションで、各未来からの結果をリストに保存して返す)。
scala - Scala のアクターのグループで最初に完了したアクターを取得するにはどうすればよいですか?
適度な数の長期実行アクターがあり、完了した最初のアクターを返す同期関数を書きたいと考えています。先物のスピン待機でそれを行うことができます(例:
)、しかしそれは非常に「俳優らしくない」ようです
このscala.actors.Futures
クラスには 2 つのメソッドが awaitAll()
ありawaitEither()
、非常に近いように見えます。もしあれば、awaitAny()
私はそれに飛びつきます。これを行う簡単な方法がありませんか、それとも適用可能な一般的なパターンはありますか?
nhibernate - ToRowCountQueryはグループ化を無視しているようです
通常のクエリからrowcount-queryを作成しようとしていますが、結果のSQLにGROUP BYがないため、カウントが間違っているようです。誰かが私が間違っていることを知っていますか?
最初のクエリ:
結果のSQL:
では、rowcount-queryのGROUP BYはどこにありますか?
UPDATE 結局のところ、ToRowCountQueryは、元のクエリから選択とグループ化を取り除きます。では、どうすればこのようなことができますか?
Firoの答えは正しい方向への一歩のようですが、選択リストに示されている最小/最大フィールドを含むすべてのフィールドのカウントが必要なため、CountDistinctを使用できません。その次に、CountDistinctは引数としてIProjectionを取りません:
更新2
フィロの答えのリンクに基づいて、私はこの代替案を思いついた。query
切り離されたQueryOverオブジェクトになるように変更しました。次に、私はこれを試しました:
ただし、これによりArgumentOutOfRangeException
:
scala - Akka を使用して fork および join
問題文: 並行して処理する必要がある証券のポートフォリオがあります。Java では、スレッドプールを使用して各セキュリティを処理し、ラッチを使用してカウントダウンを行いました。完了したら、マージなどを行います。
したがって、SecurityProcessor (アクター) にメッセージを送信し、すべての先物が完了するのを待ちます。最後に、MergeHelper を使用して後処理を行います。SecurityProcessor はセキュリティを受け取り、いくつかの i/o と処理を行い、セキュリティに応答します
この設計は正しいですか? akka を使用してこの一般的な問題を実装するためのより良い/よりクールな方法はありますか?
nhibernate - LinqからNHibernate+変換+先物
.ToFuture <>()拡張メソッドを呼び出すことで、LinqtoNHibernateクエリをfutureとして実行できることを知っています。ただし、マップされたエンティティをロードするのではなく、データをDTOに直接ロードしています。したがって、次のようなものが得られます。
これは私が望むようには機能しません(私はあえて期待したと言います)。エラーが発生しました。The value "System.Object[]" is not of type "Entity" and cannot be used in this generic collection.
削除.ToFuture()
しても機能しますが、クエリはバッチ処理されません。
QueryOver APIを使用してこれを実行できることはわかっています。コードが非常にクリーンなため、LinqtoNHの方が好きです。