Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update building-runtime.md #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions docs/crates/tokio/docs/going-deeper/building-runtime.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@

## 常用的组件

我们肯定需要一个Reactor来接受来自操作系统的外部事件(比如可读的网络套接字)。它是通过mio crate阻塞epoll,kqueue或其他依赖于操作系统的原语来实现的。这不能将等待委托给任何其他东西,因此反应堆会进入堆栈的底部
我们肯定需要一个Reactor来接受来自操作系统的外部事件(比如可读的网络套接字)。它是通过mio crate阻塞epoll,kqueue或其他依赖于操作系统的原语来实现的。这不能将等待委托给任何其他东西,因此响应器(reactor)会进入堆栈的底部

反应堆能够通过网络和类似事件通知我们的 `future`数据,但我们需要一个执行者来实际运行它们。我们将使用CurrentThread执行程序,因为我们正在构建单线程运行时。使用任何其他适合您需求的执行程序。当没有准备好运行的 `future`时,执行者需要在下面的Park等待。它没有实现Park,因此它必须位于整个堆栈的顶部。
响应器(reactor)能够通过网络和类似事件通知我们的 `future`数据,但我们需要一个执行者来实际运行它们。我们将使用CurrentThread执行程序,因为我们正在构建单线程运行时。使用任何其他适合您需求的执行程序。当没有准备好运行的 `future`时,执行者需要在下面的Park等待。它没有实现Park,因此它必须位于整个堆栈的顶部。

虽然不是绝对必要,但是能够运行延迟的 `future` - 超时和类似的是有用的。因此,我们将Timer置于中间位置 - 幸运的是,它可以放置在一个Park的顶部并且还可以实现Park。对于基于IO的 `future`反应堆而言,这与超时类似。
虽然不是绝对必要,但是能够运行延迟的 `future` - 超时和类似的是有用的。因此,我们将Timer置于中间位置 - 幸运的是,它可以放置在一个Park的顶部并且还可以实现Park。对于基于IO的 `future`响应器(reactor)而言,这与超时类似。

此外,可以添加任何自定义图层。一个例子可能是某种闲置的簿记组件 - 如果被要求等待和交错,让它下面的`Park`也拿起事件,它会尝试重复做一些工作。如果没有簿记要做,它只会委托等待。

这就是反应堆,计时器和执行器的创建在代码中的样子:
这就是响应器(reactor),计时器和执行器的创建在代码中的样子:

```rust
let reactor = Reactor::new()?;
Expand All @@ -36,7 +36,7 @@ let timer_handle = timer.handle();
let mut executor = CurrentThread::new_with_park(timer);
```

这样,如果要执行 `future`,它们将首先执行。 然后,一旦它用完了准备好的 `future`,它将寻找触发超时。 这可能会产生一些更准备好的 `future`(接下来会执行)。 如果没有超时触发,则计时器计算反应堆可以安全阻塞的时间并让它等待外部事件
这样,如果要执行 `future`,它们将首先执行。 然后,一旦它用完了准备好的 `future`,它将寻找触发超时。 这可能会产生一些更准备好的 `future`(接下来会执行)。 如果没有超时触发,则计时器计算响应器(reactor)可以安全阻塞的时间并让它等待外部事件

## 全局状态

Expand Down Expand Up @@ -74,4 +74,4 @@ let result = tokio_reactor::with_default(

其次,我们希望使用与默认执行程序和默认当前线程执行程序相同的执行程序,并且还运行执行程序(不仅在不再等待的情况下将 `future`产生到它上)。要做到这两点,我们需要两个可变的引用,这是不可能的。为了解决这个问题,我们设置了当前的线程执行器(它实际上在executor.block_on调用中设置了自己,或者任何类似的线程执行器)。我们使用TaskExecutor作为默认值,它是当前线程执行程序在使用时配置的代理。

最后,block_on将执行单个future将完成(并将处理在执行程序中生成的任何其他 `future`,但如果f先完成,它将不会等待它们完成)。 `future`的结果是通过所有with_default调用向上冒泡,并且可以以任何其他方式返回或使用。如果你想等待所有其他 `future`也完成,那么还有executor.run,可以在之后执行。
最后,block_on将执行单个future将完成(并将处理在执行程序中生成的任何其他 `future`,但如果f先完成,它将不会等待它们完成)。 `future`的结果是通过所有with_default调用向上冒泡,并且可以以任何其他方式返回或使用。如果你想等待所有其他 `future`也完成,那么还有executor.run,可以在之后执行。