Merge pull request #10 from sunface/main

sync
pull/833/head
Rustln 3 years ago committed by GitHub
commit 09bc66418c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -87,6 +87,13 @@
<sub><b>zongzi531</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Rustln">
<img src="https://avatars.githubusercontent.com/u/100085326?v=4?s=100" width="100px" alt=""/>
<br />
<sub><b>Rustln</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/1132719438">
<img src="https://avatars.githubusercontent.com/u/10138791?v=4?s=100" width="100px" alt=""/>
@ -101,13 +108,6 @@
<sub><b>Mintnoii</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Rustln">
<img src="https://avatars.githubusercontent.com/u/100085326?v=4?s=100" width="100px" alt=""/>
<br />
<sub><b>Rustln</b></sub>
</a>
</td>
</tr>
</table>

@ -75,31 +75,31 @@ Rust语言真的好连续六年成为全世界最受欢迎的语言、没有G
<table>
<tr>
<td align="center" width="25%">
<a href="https://github.com/1132719438">
<img src="https://avatars.githubusercontent.com/u/10138791?v=4?s=100" alt=""/>
<a href="https://github.com/zongzi531">
<img src="https://avatars.githubusercontent.com/u/22429236?v=4?s=100" alt=""/>
<br />
<sub><b>1132719438</b></sub>
<sub><b>zongzi531</b></sub>
</a>
</td>
<td align="center" width="25%">
<a href="https://github.com/zongzi531">
<img src="https://avatars.githubusercontent.com/u/22429236?v=4?s=100" alt=""/>
<a href="https://github.com/Rustln">
<img src="https://avatars.githubusercontent.com/u/100085326?v=4?s=100" alt=""/>
<br />
<sub><b>zongzi531</b></sub>
<sub><b>Rustln</b></sub>
</a>
</td>
<td align="center" width="25%">
<a href="https://github.com/Mintnoii">
<img src="https://avatars.githubusercontent.com/u/30466018?v=4?s=100" alt=""/>
<a href="https://github.com/1132719438">
<img src="https://avatars.githubusercontent.com/u/10138791?v=4?s=100" alt=""/>
<br />
<sub><b>Mintnoii</b></sub>
<sub><b>1132719438</b></sub>
</a>
</td>
<td align="center" width="25%">
<a href="https://github.com/Rustln">
<img src="https://avatars.githubusercontent.com/u/100085326?v=4?s=100" alt=""/>
<a href="https://github.com/Mintnoii">
<img src="https://avatars.githubusercontent.com/u/30466018?v=4?s=100" alt=""/>
<br />
<sub><b>Rustln</b></sub>
<sub><b>Mintnoii</b></sub>
</a>
</td>
</tr>

@ -109,7 +109,7 @@ async fn main() {
}
```
以上代码很清晰的解释了如何自定义一个 `Future`,并指定它如何通过 `poll` 一步一步执行,直到最终完成返回 "done" 字符串。
以上代码很清晰的解释了如何自定义一个 `Future`,并指定它如何通过 `poll` 一步一步执行,直到最终完成返回 `"done"` 字符串。
#### async fn 作为 Future
@ -247,7 +247,7 @@ impl MiniTokio {
鉴于此,我们的 mini-tokio 只应该在 `Future` 准备好可以进一步运行后,才去 `poll` 它,例如该 `Future` 之前阻塞等待的**资源**已经准备好并可以被使用了,就可以对其进行 `poll`。再比如,如果一个 `Future` 任务在阻塞等待从 TCP socket 中读取数据,那我们只想在 `socket` 中有数据可以读取后才去 `poll` 它,而不是没事就 `poll` 着玩。
回到上面的代码中mini-tokio 只应该当任务的延迟时间到了后,才去 `poll` 它。 为了实现这个功能,我们需要 `通知 -> 运行` 机制:当任务可以进一步被推进运行时,它会主动通知执行器,然后执行器再来 `poll`
回到上面的代码中mini-tokio 只应该当任务的延迟时间到了后,才去 `poll` 它。 为了实现这个功能,我们需要 `通知 -> 运行` 机制:当任务可以进一步被推进运行时,它会主动通知执行器,然后执行器再来 `poll`
## Waker
@ -347,7 +347,7 @@ impl Future for Delay {
#### 处理 wake 通知
下面,让我们更新 mint-tokio 服务,让它能接 wake 通知:当 `waker.wake()` 被调用后,相关联的任务会被放入执行器的队列中,然后等待执行器的调用执行。
下面,让我们更新 mint-tokio 服务,让它能接 wake 通知:当 `waker.wake()` 被调用后,相关联的任务会被放入执行器的队列中,然后等待执行器的调用执行。
为了实现这一点,我们将使用消息通道来排队存储这些被唤醒并等待调度的任务。有一点需要注意,从消息通道接收消息的线程(执行器所在的线程)和发送消息的线程(唤醒任务时所在的线程)可能是不同的,因此消息( `Waker` )必须要实现 `Send``Sync`,才能跨线程使用。
@ -416,7 +416,7 @@ impl ArcWake for Task {
}
```
当之前的计时器线程调用 `waker.wake()` 时,所在的任务会被推入到消息通道中。因此接下来,我们需要实现接端的功能,然后 `MiniTokio::run()` 函数中执行该任务:
当之前的计时器线程调用 `waker.wake()` 时,所在的任务会被推入到消息通道中。因此接下来,我们需要实现接端的功能,然后 `MiniTokio::run()` 函数中执行该任务:
```rust
impl MiniTokio {

@ -495,7 +495,7 @@ error[E0599]: no method named `poll` found for struct
#### 修改一个分支
下面一起来看一个稍微复杂一些的 `loop` 循环,首先,我们拥有:
下面一起来看一个稍微复杂一些的 `loop` 循环,首先,我们拥有:
- 一个消息通道可以传递 `i32` 类型的值
- 定义在 `i32` 值上的一个异步操作
@ -566,7 +566,7 @@ thread 'main' panicked at '`async fn` resumed after completion', src/main.rs:1:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```
`async fn resumed after completion'` 错误的含义是:`async fn` 异步函数在完成后,依然被恢复了(继续使用)。
```'`async fn` resumed after completion'``` 错误的含义是:`async fn` 异步函数在完成后,依然被恢复了(继续使用)。
回到例子中来,这个错误是由于 `operation` 在它已经调用完成后依然被使用。通常来说,当使用 `.await` 后,调用 `.await` 的值会被消耗掉,因此并不存在这个问题。但是在这例子中,我们在引用上调用 `.await`,因此之后该引用依然可以被使用。

@ -180,6 +180,16 @@ got = b"6"
还有一点可以改进的地方:当 `filter``map` 一起使用时,你往往可以用一个统一的方法来实现 [`filter_map`](https://docs.rs/tokio-stream/0.1.8/tokio_stream/trait.StreamExt.html#method.filter_map)。
```rust
let messages = subscriber
.into_stream()
.filter_map(|msg| match msg {
Ok(msg) if msg.content.len() == 1 => msg.unwrap().content,
_ => None,
})
.take(3);
```
想要学习更多的适配器,可以看看 [`StreamExt`](https://docs.rs/tokio-stream/0.1.8/tokio_stream/trait.StreamExt.html) 特征。
## 实现 Stream 特征
@ -265,3 +275,6 @@ stream! {
```
嗯,看上去还是相当不错的,代码可读性大幅提升!
<!-- todo generators -->
是不是发现了一个关键字 `yield` ,他是用来配合生成器使用的。详见[原文](https://doc.rust-lang.org/beta/unstable-book/language-features/generators.html)

@ -451,7 +451,7 @@ error: `..` can only be used once per tuple pattern // 每个元组模式只能
error: could not compile `world_hello` due to previous error ^^
```
Rust 无法判断,`second` 应该匹配 `numbers` 中的第几个元素,因此这里使用两个 `..` 模式,是很大歧义的!
Rust 无法判断,`second` 应该匹配 `numbers` 中的第几个元素,因此这里使用两个 `..` 模式,是很大歧义的!
### 匹配守卫提供的额外条件

@ -92,7 +92,6 @@ enum IpAddr {
}
fn main() {
// let d_panic = Direction::South;
let ip1 = IpAddr::Ipv6;
let ip_str = match ip1 {
IpAddr::Ipv4 => "127.0.0.1",

@ -292,9 +292,7 @@ jobs:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: check
- run: cargo check
test:
name: Test Suite
@ -306,9 +304,7 @@ jobs:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: test
- run: cargo test
fmt:
name: Rustfmt
@ -321,10 +317,7 @@ jobs:
toolchain: stable
override: true
- run: rustup component add rustfmt
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
- run: cargo fmt --all -- --check
clippy:
name: Clippy
@ -337,10 +330,7 @@ jobs:
toolchain: stable
override: true
- run: rustup component add clippy
- uses: actions-rs/cargo@v1
with:
command: clippy
args: -- -D warnings
- run: cargo clippy -- -D warnings
```
## 构建

Loading…
Cancel
Save