2

私はここ数日で node.js をプログラミングしていて、非同期ライブラリを頻繁に使用していました。非同期プログラミングの一般的なワークフローを処理する関数を導入するライブラリです。非同期呼び出しを並列または次々に実行し、すべての関数が終了した (またはエラーが発生した) 後に単一のコールバックを呼び出す関数があります。

このような C++ 用のライブラリはありますか?

私は非同期プログラミングが本当に好きですが、膨大な量のコールバック (すべてエラー処理などを含む) は、読み取りと保守が非常に難しく、見苦しいものです。非同期ライブラリで経験した方法でコーディングを続けたいと思っています。

C++ のような動的型付けの少ない言語では、このようなライブラリを実現するのは難しいと思います。

PS: 非同期コードをよりきれいにする方法の提案も大歓迎です。

編集: C++ 11 で g++ を使用しています。

編集 2:「非同期」とは、バックグラウンドで並列スレッドを実行するのではなく、このコンテキストでコールバックを使用して非ブロッキング関数を操作することを意味します。例はboost:asioです。

編集 3: 私は既に boost::asio を使用しており、そのようなライブラリを使用してコードの読みやすさ (制御フローの明確さなど) を向上させたいと考えています。

4

4 に答える 4

6

すでに知っているはずですが、boost.asio を使用していることを考えると、boost.asio を使用すると、そこに到達することができます。しかし、それは同じになるつもりはありません。理由を説明しましょう。

node と asio はどちらもプロアクターのアイデアに基づいて設計されています。何かをブロックする (または単に遅い) 場合は、ジョブをプロアクターに送信します。ジョブは適切なときに実行され、終了時にコールバックを呼び出します。

しかし、ノードでは、すべてがプロクターを通過します。他の種類の非同期 API はありません。MySQL データベースと対話したい場合、インターフェースは SQL ステートメントを受け取り、行セットでコールバックします。C++ では、インターフェイスは SQL ステートメントを受け取り、カーソルを与える前にブロックするか、ポーリングまたはブロックできるオブジェクトを与えます。ファイルとソケットの場合、 asio には完全なラッパーがあるため、 selectorのような他のすべての API を無視できますがaio_read、それ以外のほとんどの場合、ラッパーを作成する作業を行う必要があり、多くの場合、それは大変な作業になります。

もっと深刻なことに、ノードの標準コールバック インターフェイスは ですcallback(error, result)。ここで、resultは適切な任意のメンバーを持つことができる JS オブジェクトです。asio の標準コールバック インターフェイスはvoid callback(const error_code&)で、結果はありません。変更可能なオブジェクトをタスクにバインドします。前のオブジェクトが可変データをどのように隠蔽したかを知らずにオブジェクトが別のオブジェクトをフォローすることはできないため、これはすでに制御フローを行うのをより不器用にします。これは、必要かどうかに関係なく、共有された変更可能なデータ (ノードとは異なり、スレッド間で共有される可能性がある) が必要であることも意味します。しかし、もちろん最大の問題は、データが静的に型付けされていることです。(多くの場合、人々は C++ クラスを構築し、タスクを同じオブジェクトのバインドされたメソッドにすることで状態を共有しますが、実際には必要ありません。)

もちろん、C++ で完全に動的なオブジェクトを実行するコードを作成することはできます (または、a のように 1 レベルの動的性だけvector<boost::any>で十分です)。 C++ に移行することで得られると期待していたパフォーマンス上の利点。

したがって、 とvoid async::waterfall(vector<void(const error_code&)>> tasks)まったく同じことを行うような関数を作成するのは非常に簡単async.waterfall(tasks)ですが、探しているのと同じ利点がすべて得られるわけではありません。

考慮すべきもう 1 つの点は、何らかの理由で C++ に切り替えたことです。速度が遅く、リソースに制約のあるシステムを使用しているからです。proactor を使用して と同等のデータ並列処理を実現することasync.forEachは不可能ではありませんが、単純な古いスレッド プールとそれを使用する方法を知っている parallel-for ライブラリほど効率的ではありません。

于 2012-09-28T18:11:58.967 に答える
3

単純に C++ を使用します。std::async仕事をします。標準の C++ ライブラリ以外は必要ありません (C++11 が必要です。既にいくつかのコンパイラで実装されています)。

于 2012-09-28T08:56:46.480 に答える
2

async と C++ について話すとき、asioが頭に浮かびます。このライブラリは非同期 I/O に重点を置いていますが、フレームワークで使用するカスタム「サービス」を作成することもできます (たとえば、この例に示すように)。

于 2012-09-28T09:00:24.263 に答える
1

個人的には、C++11 の標準ライブラリに関する Walter の推奨事項に同意しますが、次の点も指摘したいと思います。

ブーストアジア

完全性のために。

于 2012-09-28T09:08:08.163 に答える