【发布时间】:2020-12-07 11:15:36
【问题描述】:
我有一个UIO driver,它在所谓的wait_on_complete 函数中轮询文件描述符以等待中断。这是完全同步的,所以会阻塞(有超时)。我想迁移代码,使wait_on_complete 是async(或者可以轻松包装以创建有用的Future),但我不确定最好的策略。
我对选项的看法是:
- 使用
mio::Poll,据我了解,这意味着使用 Tokio 反应器,但我无法在 Tokio ^0.3 中遵循此 API。在 Tokio 0.2 中似乎有一个 few things around 这个,但它们已经消失了(尽管它似乎仍然在代码中 - 这只是缺少文档吗?)。 - 使用
polling之类的东西,它带有自己的反应器。问题在于驱动程序似乎放错了反应堆的位置。 - 在自己的线程中运行同步代码并与
async通道通信。鉴于async的要点之一是正确集成异步 IO,这在架构上似乎是一个糟糕的选择(实际上,IO 非常适合主状态机)。 - 还有一些我不知道的事情。
(1) 似乎是显而易见的解决方案,但我并不完全清楚如何去做。是否有一些关于创建自己的mio 设备并在 Tokio 运行时中使用它的最新文档?
还有没有其他方法可以让我做我想做的事?我是否在考虑中遗漏了什么?
【问题讨论】:
-
大多数运行时都有一种方法来处理阻塞任务,方法是在单独的线程上运行它们。见
tokio::spawn_blocking -
@IbraheemAhmed 谢谢,我知道(这是我列表中 (3) 的假定机制)。
标签: asynchronous rust rust-tokio mio