2018-02-07 13:28:29 -08:00
|
|
|
# Tokio
|
2016-08-05 16:21:56 -07:00
|
|
|
|
2018-02-28 15:03:45 -08:00
|
|
|
A runtime for writing reliable, asynchronous, and slim applications with
|
2018-03-05 20:12:43 +01:00
|
|
|
the Rust programming language. It is:
|
2018-02-28 15:03:45 -08:00
|
|
|
|
|
|
|
|
* **Fast**: Tokio's zero-cost abstractions give you bare-metal
|
|
|
|
|
performance.
|
|
|
|
|
|
|
|
|
|
* **Reliable**: Tokio leverages Rust's ownership, type system, and
|
|
|
|
|
concurrency model to reduce bugs and ensure thread safety.
|
|
|
|
|
|
|
|
|
|
* **Scalable**: Tokio has a minimal footprint, and handles backpressure
|
|
|
|
|
and cancellation naturally.
|
2016-08-05 16:21:56 -07:00
|
|
|
|
2018-03-07 22:28:01 -08:00
|
|
|
[![Crates.io][crates-badge]][crates-url]
|
|
|
|
|
[![MIT licensed][mit-badge]][mit-url]
|
2019-03-01 09:12:21 -08:00
|
|
|
[![Build Status][azure-badge]][azure-url]
|
2019-11-26 16:00:38 -08:00
|
|
|
[![Discord chat][discord-badge]][discord-url]
|
2018-02-27 20:35:50 +03:00
|
|
|
|
2018-03-07 22:28:01 -08:00
|
|
|
[crates-badge]: https://img.shields.io/crates/v/tokio.svg
|
|
|
|
|
[crates-url]: https://crates.io/crates/tokio
|
|
|
|
|
[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
|
2019-04-27 20:56:40 +01:00
|
|
|
[mit-url]: LICENSE
|
2019-03-01 09:12:21 -08:00
|
|
|
[azure-badge]: https://dev.azure.com/tokio-rs/Tokio/_apis/build/status/tokio-rs.tokio?branchName=master
|
|
|
|
|
[azure-url]: https://dev.azure.com/tokio-rs/Tokio/_build/latest?definitionId=1&branchName=master
|
2019-11-26 16:00:38 -08:00
|
|
|
[discord-badge]: https://img.shields.io/discord/500028886025895936.svg?logo=discord&style=flat-square
|
2020-01-09 23:41:07 -05:00
|
|
|
[discord-url]: https://discord.gg/tokio
|
2016-08-05 16:21:56 -07:00
|
|
|
|
2018-02-07 13:28:29 -08:00
|
|
|
[Website](https://tokio.rs) |
|
2020-02-12 01:56:13 +10:00
|
|
|
[Guides](https://tokio.rs/docs/overview/) |
|
2019-09-17 22:54:22 +08:00
|
|
|
[API Docs](https://docs.rs/tokio/latest/tokio) |
|
2019-12-19 03:54:35 +13:00
|
|
|
[Roadmap](https://github.com/tokio-rs/tokio/blob/master/ROADMAP.md) |
|
2020-01-09 23:41:07 -05:00
|
|
|
[Chat](https://discord.gg/tokio)
|
2018-02-07 13:28:29 -08:00
|
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
|
2018-02-28 15:03:45 -08:00
|
|
|
Tokio is an event-driven, non-blocking I/O platform for writing
|
|
|
|
|
asynchronous applications with the Rust programming language. At a high
|
|
|
|
|
level, it provides a few major components:
|
|
|
|
|
|
2018-03-05 20:12:43 +01:00
|
|
|
* A multithreaded, work-stealing based task [scheduler].
|
2019-08-17 23:34:25 -07:00
|
|
|
* A reactor backed by the operating system's event queue (epoll, kqueue,
|
2018-02-28 15:03:45 -08:00
|
|
|
IOCP, etc...).
|
|
|
|
|
* Asynchronous [TCP and UDP][net] sockets.
|
2017-01-11 09:14:50 -08:00
|
|
|
|
2018-02-28 15:03:45 -08:00
|
|
|
These components provide the runtime components necessary for building
|
|
|
|
|
an asynchronous application.
|
2016-08-05 16:21:56 -07:00
|
|
|
|
2019-09-17 22:54:22 +08:00
|
|
|
[net]: https://docs.rs/tokio/latest/tokio/net/index.html
|
|
|
|
|
[scheduler]: https://docs.rs/tokio/latest/tokio/runtime/index.html
|
2016-08-08 23:18:49 -07:00
|
|
|
|
2018-03-01 21:48:18 -08:00
|
|
|
## Example
|
|
|
|
|
|
|
|
|
|
A basic TCP echo server with Tokio:
|
|
|
|
|
|
2019-11-22 15:55:10 -08:00
|
|
|
```rust,no_run
|
2018-03-01 21:48:18 -08:00
|
|
|
use tokio::net::TcpListener;
|
2019-08-06 14:03:49 -07:00
|
|
|
use tokio::prelude::*;
|
2018-03-01 21:48:18 -08:00
|
|
|
|
2019-08-06 14:03:49 -07:00
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
2019-11-22 15:55:10 -08:00
|
|
|
let mut listener = TcpListener::bind("127.0.0.1:8080").await?;
|
2019-08-06 14:03:49 -07:00
|
|
|
|
|
|
|
|
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) => {
|
2019-11-22 15:55:10 -08:00
|
|
|
eprintln!("failed to read from socket; err = {:?}", e);
|
2019-08-06 14:03:49 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Write the data back
|
|
|
|
|
if let Err(e) = socket.write_all(&buf[0..n]).await {
|
2019-11-22 15:55:10 -08:00
|
|
|
eprintln!("failed to write to socket; err = {:?}", e);
|
2019-08-06 14:03:49 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-03-01 21:48:18 -08:00
|
|
|
});
|
2019-08-06 14:03:49 -07:00
|
|
|
}
|
2018-03-01 21:48:18 -08:00
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2020-01-08 00:55:10 +01:00
|
|
|
More examples can be found [here](examples).
|
2018-03-07 22:28:01 -08:00
|
|
|
|
2018-08-24 13:03:34 -07:00
|
|
|
## Getting Help
|
|
|
|
|
|
|
|
|
|
First, see if the answer to your question can be found in the [Guides] or the
|
|
|
|
|
[API documentation]. If the answer is not there, there is an active community in
|
2019-11-26 16:00:38 -08:00
|
|
|
the [Tokio Discord server][chat]. We would be happy to try to answer your
|
2019-11-27 23:05:42 +03:00
|
|
|
question. Last, if that doesn't work, try opening an [issue] with the question.
|
2018-08-24 13:03:34 -07:00
|
|
|
|
2019-07-04 07:59:10 +02:00
|
|
|
[Guides]: https://tokio.rs/docs/
|
2019-09-17 22:54:22 +08:00
|
|
|
[API documentation]: https://docs.rs/tokio/latest/tokio
|
2020-01-09 23:41:07 -05:00
|
|
|
[chat]: https://discord.gg/tokio
|
2018-08-24 13:03:34 -07:00
|
|
|
[issue]: https://github.com/tokio-rs/tokio/issues/new
|
|
|
|
|
|
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
|
|
:balloon: Thanks for your help improving the project! We are so happy to have
|
|
|
|
|
you! We have a [contributing guide][guide] to help you get involved in the Tokio
|
|
|
|
|
project.
|
|
|
|
|
|
2020-02-22 21:00:58 -08:00
|
|
|
[guide]: https://github.com/tokio-rs/tokio/blob/master/CONTRIBUTING.md
|
2018-08-24 13:03:34 -07:00
|
|
|
|
2019-06-28 13:13:46 -07:00
|
|
|
## Related Projects
|
|
|
|
|
|
|
|
|
|
In addition to the crates in this repository, the Tokio project also maintains
|
|
|
|
|
several other libraries, including:
|
|
|
|
|
|
2020-01-21 10:00:18 -05:00
|
|
|
* [`hyper`]: A fast and correct HTTP/1.1 and HTTP/2 implementation for Rust.
|
|
|
|
|
|
|
|
|
|
* [`tonic`]: A gRPC over HTTP/2 implementation focused on high performance, interoperability, and flexibility.
|
|
|
|
|
|
|
|
|
|
* [`warp`]: A super-easy, composable, web server framework for warp speeds.
|
|
|
|
|
|
|
|
|
|
* [`tower`]: A library of modular and reusable components for building robust networking clients and servers.
|
|
|
|
|
|
2019-06-28 13:13:46 -07:00
|
|
|
* [`tracing`] (formerly `tokio-trace`): A framework for application-level
|
|
|
|
|
tracing and async-aware diagnostics.
|
2020-01-21 10:00:18 -05:00
|
|
|
|
|
|
|
|
* [`rdbc`]: A Rust database connectivity library for MySQL, Postgres and SQLite.
|
2019-06-28 13:13:46 -07:00
|
|
|
|
|
|
|
|
* [`mio`]: A low-level, cross-platform abstraction over OS I/O APIs that powers
|
|
|
|
|
`tokio`.
|
|
|
|
|
|
|
|
|
|
* [`bytes`]: Utilities for working with bytes, including efficient byte buffers.
|
|
|
|
|
|
2020-01-21 10:00:18 -05:00
|
|
|
* [`loom`]: A testing tool for concurrent Rust code
|
|
|
|
|
|
|
|
|
|
[`warp`]: https://github.com/seanmonstar/warp
|
|
|
|
|
[`hyper`]: https://github.com/hyperium/hyper
|
|
|
|
|
[`tonic`]: https://github.com/hyperium/tonic
|
|
|
|
|
[`tower`]: https://github.com/tower-rs/tower
|
|
|
|
|
[`loom`]: https://github.com/tokio-rs/loom
|
|
|
|
|
[`rdbc`]: https://github.com/tokio-rs/rdbc
|
2019-06-28 13:13:46 -07:00
|
|
|
[`tracing`]: https://github.com/tokio-rs/tracing
|
|
|
|
|
[`mio`]: https://github.com/tokio-rs/mio
|
|
|
|
|
[`bytes`]: https://github.com/tokio-rs/bytes
|
|
|
|
|
|
2018-08-29 17:35:27 -07:00
|
|
|
## Supported Rust Versions
|
|
|
|
|
|
|
|
|
|
Tokio is built against the latest stable, nightly, and beta Rust releases. The
|
|
|
|
|
minimum version supported is the stable release from three months before the
|
|
|
|
|
current stable release version. For example, if the latest stable Rust is 1.29,
|
|
|
|
|
the minimum version supported is 1.26. The current Tokio version is not
|
|
|
|
|
guaranteed to build on Rust versions earlier than the minimum supported version.
|
|
|
|
|
|
2018-08-30 14:46:40 -07:00
|
|
|
## License
|
|
|
|
|
|
|
|
|
|
This project is licensed under the [MIT license](LICENSE).
|
|
|
|
|
|
2017-10-30 14:16:46 -07:00
|
|
|
### Contribution
|
|
|
|
|
|
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally submitted
|
2018-03-09 20:07:09 -08:00
|
|
|
for inclusion in Tokio by you, shall be licensed as MIT, without any additional
|
|
|
|
|
terms or conditions.
|