Rust 异步运行时(例如 tokio)如何处理通道?

问题描述 投票:0回答:1

我是一名C程序员。我写了一个程序,它有一个线程做两件事:

  • 处理程序网络接口(接收请求和发送响应);
  • 等待来自其他线程的消息。

我在这个线程中使用了

epoll
。它轻松处理网络。但是,为了等待消息,我必须使用
pipe
来传递消息,因为
pipe
的fd可以由
epoll
处理。

--

现在,我正在学习 Rust 及其异步部分。我发现异步运行时(例如 tokio):

  • 也用
    epoll
  • 可以同时处理网络IO和通道;
  • 不过,我猜频道应该不是由
    pipe
    实现的。

所以,我的问题是,这些运行时如何处理通道(通过

epoll
)以及网络 IO?或者频道在收到消息时如何唤醒
epoll

换句话说,当没有任务可做时,运行时会阻塞在哪里?比如C程序中有

epoll
,没有任务时会阻塞在
epoll_wait

我尝试阅读代码,但封装级别太多。很难找到简单的答案。所以我来了。

asynchronous rust
1个回答
0
投票

tokio
确实打电话给
epoll_wait()
。它在代码深处,在低级依赖中
mio
,但它就在那里。

但是,

tokio
仅在处理完所有未决任务后才停在
epoll_wait()
(无超时等待)。当您在通道中发送数据时,通道实现会唤醒接收方的
Waker
,这会将接收方任务置于待处理队列中(如果尚未存在)。所以 tokio 会在停车前轮询它。

© www.soinside.com 2019 - 2024. All rights reserved.