問題タブ [mio]
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.
rust - 同じメソッドを実装する 2 つのトレイトでエラーなし
docsによると、次のような 2 つの異なるトレイトによって提供されるメソッドを呼び出そうとすると、Rust は文句を言うはずです。
これを実行すると、予想されるerror: multiple applicable methods in scope
エラーが発生します。
ただし、これに対してエラーは発生しません。
mio::buf::RingBuf
Buf
と の両方を実装しRead
ます。どちらのトレイトもbytes
メソッドを提供します。
Rust が上記と同じエラーで文句を言うと思います。代わりに、「間違った」実装を静かに選択し、後でprintln
間違ったタイプについて文句を言います。
ここでエラーが発生しない理由は何ですか?
削除すると、use std::io::Read;
すべて正常に動作します。しかし、スコープ内のその特性により、突然 Read の実装が使用され、bytes は「間違った」型になります。
(私は Rust 1.0.0 を使用しています)
rust - mio::tcp::TcpStream をインポートするが、std::net::tcp::TcpStream を取得する
サンプルサーバーを適応させようとすると、TcpStream
私が求めているものと私が得ているものがまったく異なるように見えるこの動作をどうすればよいかわかりません。
構造体定義の例:
後で、 に対して定義された関数がありますConnection
。
次のエラーがwrite_slice
表示されます。
現在std::net::tcp::TcpStream
はこれを実装していませんが、実装してmio::tcp::TcpStream
います。なぜ一方が他方の代わりになるのでしょうか?
これをエイリアスとして設定しても、これにuse mil::tcp::TcpStream as MioTcpStream
は影響しません。
struct - 複数の構造体フィールドを同時に変更する最速の慣用的な方法は何ですか?
多くのライブラリでは、指定された を実装する型を定義しtrait
て、コールバック ハンドラとして使用できます。これには、イベントを処理するために必要なすべてのデータを 1 つのデータ型にまとめる必要があり、借用が複雑になります。
たとえば、を実行mio
すると、構造体を実装Handler
して提供できます。これらの自明化されたデータ型の例を考えてみましょう:EventLoop
ハンドラーには、Token
タイプ のアイテム から へのマップがありますA
。type の各アイテムには、 typeA
の関連付けられた値がある場合とない場合がありますB
。A
ハンドラーで、指定された の値を検索し、まだ値Token
がない場合B
は、ハンドラーの から値を取得しますPool<B>
。
self.map
この配置では、とself.pool
が別個のエンティティであることを直感的に確認できますが、 にアクセスすると、 が ( を介して)self
既に借用されているとボロー チェッカーが文句を言います。self.map
self.pool
これに対する考えられるアプローチの 1 つは、各フィールドを でラップすることMyHandlerType
ですOption<>
。次に、メソッド呼び出しの開始時に、take()
これらの値を取り出しself
、呼び出しの最後に復元します。
これは機能しますが、少しおかしな感じがします。self
また、メソッド呼び出しごとに値を出し入れするオーバーヘッドも発生します。
これを行う最善の方法は何ですか?
rust - mio のトークンを生成する際に注意すべき制約は何ですか?
非同期 I/Oのmio
ライブラリは、発生したイベントをソースに関連付けるために型Token
のインスタンスを提供する開発者に依存していTcpStream
ますHandler::Timeout
。
実装からわかるように、Token
は単なるラッパー型usize
です。Token
が必要になるたびに単純にカウンターをインクリメントしたくなるかもしれませんが、最終的にはオーバーフローしてしまいます。
Tokens
に渡すために生成するときに、どのようなルールを覚えておく必要がありEventLoop
ますか? 具体的な質問:
- それぞれ独自の を持つ 2 つのスレッドがある場合
EventLoop
、両方を使用Token=0
して 2 つの異なるストリームのイベントをリッスンできますか? (つまり、特定のインスタンスTokens
にバインドされていますか?)EventLoop
- を使用して aと pending の
Token=0
両方を同時に表すことはできますか? それとも両方とも同じトークンのコレクションに格納されていますか?TcpStream
Timeout
0
からにジャンプしても害はあります1,000,000
か? (例: 連番用に最適化されたデータ構造に格納されていますか?)
ありがとう!
rust - mio::udp::UdpSocket.recv からの部分的な UDP パケットの受信
mio::udp::UdpSocket を使用して、クライアントからの要求に対する応答を受信しています。トリガーされたイベントで部分的な UDP パケットを取得しているようです。これがmioライブラリのバグかどうかはわかりません。
PollOpt::level()、all()、empty()、edge() などを試しました。通常、poll() ドキュメントに基づいて level() が必要だと思いますが、どれも機能しません。20 ミリ秒のスリープを追加すると、完全なパケットが得られます。
参考までに、ブロッキング std::net::UdpSocket を使用しても問題はありません。正直なところ、std::net::SocketOpts が安定していれば、それを使用するだけです。mio を使用する目的は、ソケットでタイムアウトを取得することです。net2 が std::net を置き換えるように見えますが、net2 でさえ recv でタイムアウトがありません。
イベントループのコードは次のとおりです。
ハンドラーのコードは次のとおりです。
udp - mio を使用して UDP を操作すると、「MutBuf は MutSliceBuf 型に対して実装されていません」というエラーが表示される
学習目的で、私は現在、特定のポート セット (10000-60000 など) で動作する UDP パケット用のエコー サーバーを実装する小さなプログラムを作成しようとしています。このために 50k スレッドをスパムするのはあまり良くないので、非同期 IO を使用する必要があり、mio はこのタスクに最適です。しかし、私はこのコードで最初から問題を抱えています:
これは、mio の test_udp_socket.rs からのほぼ完全なコピーペーストです。しかし、mio のテストは正常にパススルーされますが、このコードをコンパイルしようとすると、次のエラーが発生します。
しかし、bytes クレートの src/buf/slice.rs のコード (ローカル コピーも) を調べると、このトレイトが実装されていることがはっきりとわかります。
それはおそらく些細なことですが、私はそれを見つけることができません... このエラーを引き起こす問題は何ですか?
私はrustc 1.3.0(9a92aaf19 2015-09-15)を使用しています.mioをクレートし、バイトはgithubから直接取得します。
rust - mio のバッファ タイプに関する問題
mio を使用して Rust で非同期サーバーを作成したいのですが、バッファーの種類に問題があります。さまざまな種類のバッファを試しましたが、うまくいきません。私の現在のコードは次のとおりです。
Cargo.toml
には次の依存関係が含まれています。
これは現在、Cargo.lock のバイト 0.2.11 と mio 0.4.3 に変換されます。
私が得ているエラーはこれです:
Vec<u8>
ソケットに a を書き込んで、バッファが部分的にしか書き込まれていない場合を処理できるようにしたいと思います。どうすればそれを達成できますか?
戻り値を適切に処理するコードについての説明は必要ありません。この質問はバッファ タイプに関するものです。どのバッファタイプを使用する必要があるかわかりません。
rust - ネイティブ ライブラリ `kernel32` が複数のパッケージによってリンクされています
MIO コルーチン ライブラリを複製してビルドしようとしましたが、依存関係が衝突しているようです。
time
依存関係には 0.1.4 が必要なようですkernel32
が、他の 2 つの依存関係fs2
にmemmap
は 0.2.0 が必要です。
それに対処するために私ができることはありますか、またはこのような場合の最善の解決策は、バグレポートを提出することだけですか?
関連するメモとして、リポジトリに Cargo.lock がない場合、それはバグとしてカウントされますか? このような問題を防ぐために、Cargo.lock を常にバージョン管理に追加することを推奨しているのを見てきました。