|
|
|
@ -109,7 +109,7 @@ async fn main() {
|
|
|
|
|
任务在 Tokio 中远比看上去要更轻量,例如创建一个任务仅仅需要一次64字节大小的内存分配。因此应用程序在生成任务上,完全不应该有任何心理负担,除非你在一台没那么好的机器上疯狂生成了几百万个任务。。。
|
|
|
|
|
|
|
|
|
|
#### `'static` 约束
|
|
|
|
|
当使用 Tokio 创建一个任务时,该任务类型的生命周期必须时 `'static`。意味着,在任务中不能使用外部数据的引用:
|
|
|
|
|
当使用 Tokio 创建一个任务时,该任务类型的生命周期必须是 `'static`。意味着,在任务中不能使用外部数据的引用:
|
|
|
|
|
```rust
|
|
|
|
|
use tokio::task;
|
|
|
|
|
|
|
|
|
@ -176,7 +176,7 @@ PS: 这一段内容,Tokio 的原文有些逻辑混乱,我已经尽可能的
|
|
|
|
|
> 一个关于 `'static` 生命周期的常见误解就是它将永远存活(跟整个程序活得一样久),实际上并不是这样的。同样的,一个变量是 `'static` 并不意味着它存在内存泄漏的可能性。
|
|
|
|
|
|
|
|
|
|
#### Send 约束
|
|
|
|
|
`tokio::spawn` 生成的任务必须实现 `Send` 特征,因为 Tokio 调度器会将任务在线程间进行移动,当这些任务在 `.await` 执行过程中发生阻塞时。
|
|
|
|
|
`tokio::spawn` 生成的任务必须实现 `Send` 特征,因为当这些任务在 `.await` 执行过程中发生阻塞时,Tokio 调度器会将任务在线程间移动。
|
|
|
|
|
|
|
|
|
|
**一个任务要实现 `Send` 特征,那它在 `.await` 调用的过程中所持有的全部数据都必须实现 `Send` 特征**。当 `.await` 调用发生阻塞时,任务会让出当前线程所有权给调度器,然后当任务准备好后,调度器会从上一次暂停的位置继续执行该任务。该流程能正确的工作,任务必须将`.await`之后使用的所有状态保存起来,这样才能在中断后恢复现场并继续执行。若这些状态实现了 `Send` 特征(可以在线程间安全地移动),那任务自然也就可以在线程间安全地移动。
|
|
|
|
|
|
|
|
|
|