Rust‐LibP 2 Pのための更新事例
過去1週間、私はモジュールのネットワークスタックの錆の実装のためのいくつかの例を更新する方法を理解しようとしていた.
さびの実装はぴったりと命名されます
何が問題ですか.
一週間前.an issue に
これらの例は、どのように1つの特定の機能を達成するためにrust - libp 2 pを使用する方法を実証したかどうか、ファイル共有システム、シンプルなチャットシステムだけでなく、非常に簡単です
Rust - libp 2 pライブラリは、同時実行を達成するために非同期ライブラリに大きく依存します.そのため、ライブラリのクライアントは効率的な非同期コードを持ちながらスレッドを心配する必要はありません.
この問題で要求された変更はイベントループの変更に関連していた.イベントループの責任は、標準入力からの入力、またはローカルピアに接続する新しいピアなど、利用可能な先物をポーリングすることです.
大胆な言葉のいくつかがあなたの頭を越えたならば、それは全くすばらしいです.今すぐに説明します.
世論調査:最も一般的な意味では、キューに何かを待っていることを求めることを意味します.たとえば、イベントドリブンプログラミングをしている場合、それらを処理するためにそれらのイベントを受け取るのを面倒にするコンピュータに一部があります.ポーリングという行事を受け取ること我々のさびアプリケーションでは、我々は先物を世論調査します.
将来:将来が終わるかもしれないか、終わるかもしれない計算の上の抽象化です.この発言は重要です.ファイルの読み込みは計算です.ほとんどの人は それは長い説明でした!JavaScriptでいくつかの背景の経験がある場合は、約束は
説明を取り外すと、要求された変更のために何が必要ですか?さて、今では、非同期アプリを使用すると、将来の利用可能な世論調査に必要な錆で動作するように知っている、これは本当にボイラー板のようなコードが発生することができます.非同期ランタイムを使用している場合
ファイルの一つです.
私の学んだこと
私は認めなければならない、私は実際に多くのこのPRをやって学んだ!私は、非同期プログラミングがRustで働いた方法について、いくつかの記事を読みました.初めに、私は、錆が非同期の特徴などにどのように対処されたかを確信していなかったので、そのコードを理解できなかった.広範な学習期間を経て、私は、私が何をすべきかを知るのに十分なことを学びました.
libp2p
.さびの実装はぴったりと命名されます
rust-libp2p
.何が問題ですか.
一週間前.an issue に
rust-libp2p
Repoがオープンされ、リポジトリで利用可能な現在の例の変更を要求します.これらの例は、どのように1つの特定の機能を達成するためにrust - libp 2 pを使用する方法を実証したかどうか、ファイル共有システム、シンプルなチャットシステムだけでなく、非常に簡単です
ping
アプリケーション、すべてのライブラリの機能を紹介する目的で.Rust - libp 2 pライブラリは、同時実行を達成するために非同期ライブラリに大きく依存します.そのため、ライブラリのクライアントは効率的な非同期コードを持ちながらスレッドを心配する必要はありません.
この問題で要求された変更はイベントループの変更に関連していた.イベントループの責任は、標準入力からの入力、またはローカルピアに接続する新しいピアなど、利用可能な先物をポーリングすることです.
大胆な言葉のいくつかがあなたの頭を越えたならば、それは全くすばらしいです.今すぐに説明します.
世論調査:最も一般的な意味では、キューに何かを待っていることを求めることを意味します.たとえば、イベントドリブンプログラミングをしている場合、それらを処理するためにそれらのイベントを受け取るのを面倒にするコンピュータに一部があります.ポーリングという行事を受け取ること我々のさびアプリケーションでは、我々は先物を世論調査します.
将来:将来が終わるかもしれないか、終わるかもしれない計算の上の抽象化です.この発言は重要です.ファイルの読み込みは計算です.ほとんどの人は
readFile()
関数はその計算を実行します.しかし、あなたが計算自体について話したいならば、どうですか?あなたが何を参照したい場合はreadFile()
コンセプトとして、コンピュータが実行するためのアクションとしてではないですか?閉じるこの動画はお気に入りから削除されています.閉鎖は機能を意味するreadFile()
あなたが通過することができるオブジェクトとして、それはそれが終わるかもしれないか、終わるかもしれない計算であるという事実に関して抽象的でありません.この場合、クロージャは計算が終了するか、まだ実行されているかを教えてくれません.さびにおいて、その概念は未来と呼ばれますFuture
特性Future
形質は定義されますが、いくつかの違いがあります.説明を取り外すと、要求された変更のために何が必要ですか?さて、今では、非同期アプリを使用すると、将来の利用可能な世論調査に必要な錆で動作するように知っている、これは本当にボイラー板のようなコードが発生することができます.非同期ランタイムを使用している場合
tokio
or async_std
, あなたはポーリングのスケジューリングを処理するために特定の機能を使用するかもしれませんFuture
このような関数には、いくつかのセットアップを必要とする場合は、同時にいくつかの先物を処理します.ファイルの一つです.
chat.rs
, イベントループを次のようにしました.task::block_on(future::poll_fn(move |cx: &mut Context<'_>| {
loop {
match stdin.try_poll_next_unpin(cx)? {
Poll::Ready(Some(line)) => swarm
.behaviour_mut()
.floodsub
.publish(floodsub_topic.clone(), line.as_bytes()),
Poll::Ready(None) => panic!("Stdin closed"),
Poll::Pending => break,
}
}
loop {
match swarm.poll_next_unpin(cx) {
Poll::Ready(Some(SwarmEvent::NewListenAddr { address, .. })) => {
println!("Listening on {:?}", address);
}
Poll::Ready(Some(SwarmEvent::Behaviour(OutEvent::Floodsub(
FloodsubEvent::Message(message),
)))) => {
println!(
"Received: '{:?}' from {:?}",
String::from_utf8_lossy(&message.data),
message.source
);
}
Poll::Ready(Some(SwarmEvent::Behaviour(OutEvent::Mdns(
MdnsEvent::Discovered(list),
)))) => {
for (peer, _) in list {
swarm
.behaviour_mut()
.floodsub
.add_node_to_partial_view(peer);
}
}
Poll::Ready(Some(SwarmEvent::Behaviour(OutEvent::Mdns(MdnsEvent::Expired(
list,
))))) => {
for (peer, _) in list {
if !swarm.behaviour_mut().mdns.has_node(&peer) {
swarm
.behaviour_mut()
.floodsub
.remove_node_from_partial_view(&peer);
}
}
}
Poll::Ready(Some(_)) => {}
Poll::Ready(None) => return Poll::Ready(Ok(())),
Poll::Pending => break,
}
}
Poll::Pending
}))
これが非同期コードを読むのが初めてであるならば、あなたが読むのが難しいと思うならば、私はあなたを非難しません.要求された変更はこのループで指示されました:「読みやすさのためにAsyncスタイル・ループにループを変えてください」.最後の結果がどうなるかを知りたい場合は loop {
select! {
line = stdin.next() => match line {
Some(line) => swarm
.behaviour_mut()
.floodsub
.publish(floodsub_topic.clone(), line?.as_bytes()),
None => panic!("Stdin closed")
},
event = swarm.select_next_some() => match event {
SwarmEvent::NewListenAddr { address, .. } => {
println!("Listening on {:?}", address);
}
SwarmEvent::Behaviour(OutEvent::Floodsub(
FloodsubEvent::Message(message)
)) => {
println!(
"Received: '{:?}' from {:?}",
String::from_utf8_lossy(&message.data),
message.source
);
}
SwarmEvent::Behaviour(OutEvent::Mdns(
MdnsEvent::Discovered(list)
)) => {
for (peer, _) in list {
swarm
.behaviour_mut()
.floodsub
.add_node_to_partial_view(peer);
}
}
SwarmEvent::Behaviour(OutEvent::Mdns(MdnsEvent::Expired(
list
))) => {
for (peer, _) in list {
if !swarm.behaviour_mut().mdns.has_node(&peer) {
swarm.remove_node_from_partial_view(&peer);
}
}
},
_ => {}
}
}
}
興味があれば、私のPRを見ることができますhere .私の学んだこと
私は認めなければならない、私は実際に多くのこのPRをやって学んだ!私は、非同期プログラミングがRustで働いた方法について、いくつかの記事を読みました.初めに、私は、錆が非同期の特徴などにどのように対処されたかを確信していなかったので、そのコードを理解できなかった.広範な学習期間を経て、私は、私が何をすべきかを知るのに十分なことを学びました.
Reference
この問題について(Rust‐LibP 2 Pのための更新事例), 我々は、より多くの情報をここで見つけました https://dev.to/jerryhue/updating-examples-for-rust-libp2p-40hgテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol