Rust‐LibP 2 Pのための更新事例


過去1週間、私はモジュールのネットワークスタックの錆の実装のためのいくつかの例を更新する方法を理解しようとしていた. libp2p .
さびの実装はぴったりと命名されます rust-libp2p .

何が問題ですか.
一週間前.an issuerust-libp2p Repoがオープンされ、リポジトリで利用可能な現在の例の変更を要求します.
これらの例は、どのように1つの特定の機能を達成するためにrust - libp 2 pを使用する方法を実証したかどうか、ファイル共有システム、シンプルなチャットシステムだけでなく、非常に簡単ですping アプリケーション、すべてのライブラリの機能を紹介する目的で.
Rust - libp 2 pライブラリは、同時実行を達成するために非同期ライブラリに大きく依存します.そのため、ライブラリのクライアントは効率的な非同期コードを持ちながらスレッドを心配する必要はありません.
この問題で要求された変更はイベントループの変更に関連していた.イベントループの責任は、標準入力からの入力、またはローカルピアに接続する新しいピアなど、利用可能な先物をポーリングすることです.
大胆な言葉のいくつかがあなたの頭を越えたならば、それは全くすばらしいです.今すぐに説明します.

  • 世論調査:最も一般的な意味では、キューに何かを待っていることを求めることを意味します.たとえば、イベントドリブンプログラミングをしている場合、それらを処理するためにそれらのイベントを受け取るのを面倒にするコンピュータに一部があります.ポーリングという行事を受け取ること我々のさびアプリケーションでは、我々は先物を世論調査します.

  • 将来:将来が終わるかもしれないか、終わるかもしれない計算の上の抽象化です.この発言は重要です.ファイルの読み込みは計算です.ほとんどの人はreadFile() 関数はその計算を実行します.しかし、あなたが計算自体について話したいならば、どうですか?あなたが何を参照したい場合はreadFile() コンセプトとして、コンピュータが実行するためのアクションとしてではないですか?閉じるこの動画はお気に入りから削除されています.閉鎖は機能を意味するreadFile() あなたが通過することができるオブジェクトとして、それはそれが終わるかもしれないか、終わるかもしれない計算であるという事実に関して抽象的でありません.この場合、クロージャは計算が終了するか、まだ実行されているかを教えてくれません.さびにおいて、その概念は未来と呼ばれますFuture 特性
  • それは長い説明でした!JavaScriptでいくつかの背景の経験がある場合は、約束は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で働いた方法について、いくつかの記事を読みました.初めに、私は、錆が非同期の特徴などにどのように対処されたかを確信していなかったので、そのコードを理解できなかった.広範な学習期間を経て、私は、私が何をすべきかを知るのに十分なことを学びました.