#tokio #async #async-io #io

tokio_wasi

适用于编写异步I/O后端应用程序的事件驱动、非阻塞I/O平台

6个稳定版本

1.25.2 2023年6月6日
1.25.1 2023年2月11日
1.23.0 2023年1月3日
1.21.3 2022年11月8日
1.21.2 2022年9月30日

#74异步

Download history 1232/week @ 2024-03-14 4012/week @ 2024-03-21 2318/week @ 2024-03-28 1472/week @ 2024-04-04 3726/week @ 2024-04-11 5447/week @ 2024-04-18 2654/week @ 2024-04-25 1088/week @ 2024-05-02 978/week @ 2024-05-09 1330/week @ 2024-05-16 988/week @ 2024-05-23 1045/week @ 2024-05-30 1024/week @ 2024-06-06 1196/week @ 2024-06-13 1826/week @ 2024-06-20 543/week @ 2024-06-27

4,692 每月下载量
用于 36 个crate(26直接使用)

MIT 许可证

2.5MB
36K SLoC

WebAssembly版本的Tokio

使用Rust编程语言编写可靠、异步和精简应用程序的运行时。这是原始tokio的分支,以便它可以编译成WebAssembly。WebAssembly应用程序可以在WasmEdge运行时中作为轻量级且安全的替代方案,替代Linux容器中的本地编译应用程序。

  • 快速:Tokio的无成本抽象为您提供裸机性能。

  • 可靠:Tokio利用Rust的所有权、类型系统和并发模型来减少错误并确保线程安全。

  • 可扩展:Tokio具有最小的影响,并自然处理背压和取消。

概述

Tokio是使用Rust编程语言编写的异步应用程序的事件驱动、非阻塞I/O平台。从高层次来看,它提供了一些主要组件

  • 一个基于工作窃取的多线程任务调度器
  • 由操作系统的事件队列(epoll、kqueue、IOCP等)支持的reactor。
  • 异步TCP和UDP套接字。

这些组件提供了构建异步应用程序所需的运行时组件。

示例

使用Tokio的基本TCP回显服务器。

确保在Cargo.toml中激活了tokio crate的完整功能

[dependencies]
tokio_wasi = { version = "1.25", features = ["full"] }

然后,在main.rs中

use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:8080").await?;

    loop {
        let (mut socket, _) = listener.accept().await?;

        tokio::spawn(async move {
            let mut buf = [0; 1024];

            // In a loop, read data from the socket and write the data back.
            loop {
                let n = match socket.read(&mut buf).await {
                    // socket closed
                    Ok(n) if n == 0 => return,
                    Ok(n) => n,
                    Err(e) => {
                        eprintln!("failed to read from socket; err = {:?}", e);
                        return;
                    }
                };

                // Write the data back
                if let Err(e) = socket.write_all(&buf[0..n]).await {
                    eprintln!("failed to write to socket; err = {:?}", e);
                    return;
                }
            }
        });
    }
}

更多示例可以在这里找到。对于更大的“真实世界”示例,请参阅mini-redis存储库。

许可证

本项目采用MIT许可证

贡献

除非您明确声明,否则您提交的任何有意包含在Tokio中的贡献,均应按照MIT许可,不附加任何额外条款或条件。

依赖关系

~0–12MB
~115K SLoC