問題タブ [rust-tokio]
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.
asynchronous - Tokio future チェーンの複数のブランチで TcpStream を使用するには?
Rust Tokio TCP サーバーがあります。各クライアントは、次のような Tokio future チェーンによって処理されます。
問題は、ストリームを順次使用することになっているにもかかわらず、ストリームを消費するTcpStream
ため、チェーンの複数のブランチで同じものを使用できないことです。tokio::io::write_all
たとえば、データベース エラーが発生したかどうかに応じて、異なるデータを送信することが重要です。
どうすればこの問題を克服できますか? 多分別のAPIがありますか?
file - Rustでハードディスク上のファイルのチェックサムを非同期に計算するにはどうすればよいですか?
Rust / TokioスタックにTCPファイルサーバーがあります。
クライアントがファイルをアップロードするとき、データは から読み取られ、別の で開始された にtokio::net::TcpStream
書き込まれます。futures_fs::FsWriteSink
futures_fs::FsPool
ファイルが完全にアップロードされたら、クライアントから送信されたチェックサムと照合して整合性を確認する必要があります。
特にファイルが RAM に収まらない場合に、チェックサムを非同期で計算する最も簡単な方法は何ですか?
asynchronous - Rust での非同期接続プールの実装
私は Tokio TCP バックエンド アプリケーションを持っています。簡単に言うと、リクエストを受け取った後、Redis から何かを読み取り、PostgreSQL に何かを書き込み、HTTP 経由で何かをアップロードし、RabbitMQ に何かを送信します。各リクエストの処理には多くの時間がかかるため、リクエストごとに個別のタスクが作成されます。非同期モデルでは接続を共有できないため、いくつかの接続プーリングが必要です。今のところ、リクエストごとに新しい接続が確立されており、非常に過剰です。
Rust で非同期接続プールの実装を探していましたが、最新のものは見つかりませんでした。
自分で実装する方法についてアドバイスを聞きたいです。
私が思いついた唯一のアイデアは次のとおりです。
Stream/Sink
接続の内部コレクションを持つオブジェクトを実装します。接続は同じなので、LIFO か FIFO かは関係ありません。アプリケーションの起動時に、N 個の接続が割り当てられます。- このようなプールをタスク間で共有できるかどうかはわかりませんが、可能であれば、タスクは (独自のプールを確立するのではなく) 接続インスタンスのストリームをポーリングし、それを使用してから戻します。
- 利用可能な接続がなかった場合、ストリームはそれらをさらに確立するか、タスクにハングアップするように要求する可能性があります (構成によって異なります)。
- 接続が失敗した場合、その接続はドロップされ、プールには現在 N-1 個の接続が含まれているため、次の要求で新しい接続を割り当てることが決定される場合があります。
したがって、適切な答えがどこにも見つからない2つの問題があります。
何らかの方法でストリーム/シンクプールをタスク間で共有する必要がありますか/できますか? とにかく、箱
Shared
の中にいくつかの先物が見えます。futures
tokio/futures チュートリアルにはいくつかの暗い点があります。たとえば、最上位のタスクに通知する方法、つまり、それ自体は何もプールしないが、上位の先物に通知する必要がある、神話上の最も内側の未来をどのように実装するかについては説明していません。
それとも私のアプローチは完全に間違っていますか?私は自分でそれを試してみることができましたが、ワンクリック ソリューションなど、何かを見逃しているのではないかと強く疑っています。
rust - マルチキューを使用した tokio が時々ハングする、時々動作する
私はtokioStream
を使用してクレート マルチキューのベンチマークを実行し、反復可能な s を作成することで、パブリッシャー/サブスクライバーのラインに沿って何かを実装しようとしています。効率性については確信が持てません (項目をフィルター処理する数十または数百のリスナーが必要になる可能性があり、1 つの発行者が 1 ミリ秒あたり約 10 メッセージを発行することになります)。それ。しかし、今のところ、tokio::timer::Interval
まったく起動していないように見える奇妙なバグに遭遇しています。
完全なコードは以下のとおりです。
で実行していcargo bench
ます。futures
バージョン"0.1"
、tokio
バージョン"0.1"
、multiqueue
バージョン"0.3"
。
テスト全体が「[0-2] Got a num! 100」と「Sending 100」という多くのメッセージで完了することもありますが、途中でハングすることもあります (いくつかの「Sending」と「Got a」メッセージの後) または3 つの「Starting」メッセージだけでハングします。
これは で同時に実行できるタスクの数に問題があるのでtokio
はないかと思いますが、生成している両方のタイプのタスクが発生するため、これがなぜ私が実行する制限になるのかよくわかりません頻繁にエグゼキュータに時間をかけます。
これをより信頼できるものにするにはどうすればよいですか?