将同步 Rust IO 驱动程序转换为“异步”
Converting a synchronous Rust IO driver to be `async`
我有一个 UIO driver,它在所谓的 wait_on_complete
函数中轮询文件描述符以等待中断。这是完全同步的,所以阻塞(超时)。我想迁移代码,使 wait_on_complete
为 async
(或者可以轻松包装以创建有用的 Future
),但我不确定最佳策略为此。
我对选项的看法是:
- 在 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 这个,但它们已经消失了(尽管它似乎仍在代码中 - 这只是缺少文档吗?)。
- 使用像
polling
这样的东西,它有自己的反应器。问题是驱动程序似乎反应器的位置错误。
- 运行 在自己的线程中同步代码并与
async
通道通信。鉴于 async
的要点之一是正确集成异步 IO,这在架构上似乎是一个糟糕的选择(实际上,IO 非常适合主状态机)。
- 还有一些我不知道的。
(1) 似乎是显而易见的解决方案,但我并不完全清楚如何去做。是否有一些关于创建自己的 mio
设备并在 Tokio 运行时中使用它的最新文档?
我是否错过了其他方法来完成我想做的事情?我是不是漏掉了什么?
使用 async-io
中的 Async
很容易做到这一点。
制作一个封装你的 fd
的结构,为它实现 AsRawFd
,然后用 Async
.
包装它
这允许您使用 read_with
和 write_with
进行自定义异步操作。
我有一个 UIO driver,它在所谓的 wait_on_complete
函数中轮询文件描述符以等待中断。这是完全同步的,所以阻塞(超时)。我想迁移代码,使 wait_on_complete
为 async
(或者可以轻松包装以创建有用的 Future
),但我不确定最佳策略为此。
我对选项的看法是:
- 在 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 这个,但它们已经消失了(尽管它似乎仍在代码中 - 这只是缺少文档吗?)。 - 使用像
polling
这样的东西,它有自己的反应器。问题是驱动程序似乎反应器的位置错误。 - 运行 在自己的线程中同步代码并与
async
通道通信。鉴于async
的要点之一是正确集成异步 IO,这在架构上似乎是一个糟糕的选择(实际上,IO 非常适合主状态机)。 - 还有一些我不知道的。
(1) 似乎是显而易见的解决方案,但我并不完全清楚如何去做。是否有一些关于创建自己的 mio
设备并在 Tokio 运行时中使用它的最新文档?
我是否错过了其他方法来完成我想做的事情?我是不是漏掉了什么?
使用 async-io
中的 Async
很容易做到这一点。
制作一个封装你的 fd
的结构,为它实现 AsRawFd
,然后用 Async
.
这允许您使用 read_with
和 write_with
进行自定义异步操作。