|
|
|
@ -347,7 +347,7 @@ impl Future for Delay {
|
|
|
|
|
|
|
|
|
|
#### 处理 wake 通知
|
|
|
|
|
|
|
|
|
|
下面,让我们更新 mint-tokio 服务,让它能接收 wake 通知:当 `waker.wake()` 被调用后,相关联的任务会被放入执行器的队列中,然后等待执行器的调用执行。
|
|
|
|
|
下面,让我们更新 mini-tokio 服务,让它能接收 wake 通知:当 `waker.wake()` 被调用后,相关联的任务会被放入执行器的队列中,然后等待执行器的调用执行。
|
|
|
|
|
|
|
|
|
|
为了实现这一点,我们将使用消息通道来排队存储这些被唤醒并等待调度的任务。有一点需要注意,从消息通道接收消息的线程(执行器所在的线程)和发送消息的线程(唤醒任务时所在的线程)可能是不同的,因此消息( `Waker` )必须要实现 `Send`和 `Sync`,才能跨线程使用。
|
|
|
|
|
|
|
|
|
@ -522,7 +522,7 @@ async fn main() {
|
|
|
|
|
|
|
|
|
|
我们之前的 `Delay` 实现中,会在每一次 `poll` 调用时都生成一个新的线程。这么做问题不大,但是当 `poll` 调用较多时会出现明显的性能问题!一个解决方法就是记录你是否已经生成了一个线程,然后只有在没有生成时才去创建一个新的线程。但是一旦这么做,就必须确保线程的 `Waker` 在后续 `poll` 调用中被正确更新,否则你无法唤醒最近的 `Waker` !
|
|
|
|
|
|
|
|
|
|
这一段大家可能会看得云里雾里的,没办法,原文就饶来绕去,好在终于可以看代码了。。我们可以通过代码来解决疑惑:
|
|
|
|
|
这一段大家可能会看得云里雾里的,没办法,原文就绕来绕去,好在终于可以看代码了。。我们可以通过代码来解决疑惑:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
use std::future::Future;
|
|
|
|
|