【Rust日報】 2020-1-16 用 Rust 來詮釋 Epoll, Kqueue 和 IOCP

  • 2020 年 2 月 20 日
  • 筆記

用 Rust 來詮釋 Epoll, Kqueue 和 IOCP

這其實是一本書,旨在說明 Epoll,Kqueue 和 IOCP 的工作原理,我們可以將其用於高效率、高性能的 I/O。其中一些實現將會使用 rust,原文地址:https://cfsamsonbooks.gitbook.io/epoll-kqueue-iocp-explained/

擴展閱讀:Green Threads Explained in 200 Lines of Rust

reddit 上參與討論:https://www.reddit.com/r/rust/comments/ephm4t/epoll_kqueue_and_iocp_explained_with_rust/

Deadpool

Deadpool 是一個死的簡單非同步池,用於任何類型的連接和對象。

Example

use async_trait::async_trait;    #[derive(Debug)]  enum Error { Fail }    struct Computer {}  struct Manager {}  type Pool = deadpool::managed::Pool<Computer, Error>;    impl Computer {      async fn get_answer(&self) -> i32 {          42      }  }    #[async_trait]  impl deadpool::managed::Manager<Computer, Error> for Manager {      async fn create(&self) -> Result<Computer, Error> {          Ok(Computer {})      }      async fn recycle(&self, conn: &mut Computer) -> deadpool::managed::RecycleResult<Error> {          Ok(())      }  }    #[tokio::main]  async fn main() {      let mgr = Manager {};      let pool = Pool::new(mgr, 16);      let mut conn = pool.get().await.unwrap();      let answer = conn.get_answer().await;      assert_eq!(answer, 42);  }  

這個庫還提供:Database connection pools,GitHub 地址:https://github.com/bikeshedder/deadpool

factori

Factori is a testing factory library inspired by Ruby's FactoryBot.

Example

Factori provides two macros: factori!, which defines a factory for a type, and create! which instantiates it:

#[macro_use]  extern crate factori;    pub struct Vehicle {      number_wheels: u8,      electric: bool,  }    factori!(Vehicle, {      default {          number_wheels = 4,          electric = false,      }        mixin bike {          number_wheels = 2,      }  });    fn main() {      let default = create!(Vehicle);      assert_eq!(default.number_wheels, 4);      assert_eq!(default.electric, false);        // Its type is Vehicle, nothing fancy:      let vehicle: Vehicle = default;        let three_wheels = create!(Vehicle, number_wheels: 3);      assert_eq!(three_wheels.number_wheels, 3);        let electric_bike = create!(Vehicle, :bike, electric: true);      assert_eq!(electric_bike.number_wheels, 2);      assert_eq!(electric_bike.electric, true);  }