将同步 Rust IO 驱动程序转换为“异步”

Converting a synchronous Rust IO driver to be `async`

我有一个 UIO driver,它在所谓的 wait_on_complete 函数中轮询文件描述符以等待中断。这是完全同步的,所以阻塞(超时)。我想迁移代码,使 wait_on_completeasync(或者可以轻松包装以创建有用的 Future),但我不确定最佳策略为此。

我对选项的看法是:

  1. 在 Tokio 0.2 中使用 mio::Poll, which as I understand it implies using the Tokio reactor, but I can't follow the API for this in Tokio ^0.3. There seemed to be a few things around 这个,但它们已经消失了(尽管它似乎仍在代码中 - 这只是缺少文档吗?)。
  2. 使用像 polling 这样的东西,它有自己的反应器。问题是驱动程序似乎反应器的位置错误。
  3. 运行 在自己的线程中同步代码并与 async 通道通信。鉴于 async 的要点之一是正确集成异步 IO,这在架构上似乎是一个糟糕的选择(实际上,IO 非常适合主状态机)。
  4. 还有一些我不知道的。

(1) 似乎是显而易见的解决方案,但我并不完全清楚如何去做。是否有一些关于创建自己的 mio 设备并在 Tokio 运行时中使用它的最新文档?

我是否错过了其他方法来完成我想做的事情?我是不是漏掉了什么?

使用 async-io 中的 Async 很容易做到这一点。

制作一个封装你的 fd 的结构,为它实现 AsRawFd,然后用 Async.

包装它

这允许您使用 read_withwrite_with 进行自定义异步操作。