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

Asynchronous 将同步IO驱动程序转换为“异步”`,asynchronous,rust,rust-tokio,mio,Asynchronous,Rust,Rust Tokio,Mio,在一个所谓的wait\u on\u complete函数中,我有一个函数,它轮询一个文件描述符以等待一个中断。这是完全同步的,所以阻塞(有一个超时)。我想迁移代码,使wait_on_complete是异步的(或者可以很容易地包装,以便创建一个有用的未来的),但我不确定这方面的最佳策略 我对选择的想法是: 使用,据我所知,这意味着使用Tokio反应堆,但我不能在Tokio^0.3中遵循API。Tokio 0.2中似乎有一个this,但它们已经消失了(尽管代码中似乎仍然有它——这只是缺少文档吗?)

在一个所谓的
wait\u on\u complete
函数中,我有一个函数,它轮询一个文件描述符以等待一个中断。这是完全同步的,所以阻塞(有一个超时)。我想迁移代码,使
wait_on_complete
异步的(或者可以很容易地包装,以便创建一个有用的
未来的
),但我不确定这方面的最佳策略

我对选择的想法是:

  • 使用,据我所知,这意味着使用Tokio反应堆,但我不能在Tokio^0.3中遵循API。Tokio 0.2中似乎有一个this,但它们已经消失了(尽管代码中似乎仍然有它——这只是缺少文档吗?)
  • 使用类似它自己的反应堆的东西。问题是司机似乎在反应堆的错误位置
  • 在自己的线程中运行同步代码,并与
    async
    通道通信。鉴于
    async
    的要点之一是正确地集成异步IO,这在架构上似乎是一个糟糕的选择(事实上,IO非常适合主状态机)
  • 还有一些我不知道的事
  • (1) 这似乎是显而易见的解决办法,但我不完全清楚该怎么做。是否有一些关于创建自己的
    mio
    设备并在东京运行时使用该设备的最新文档


    做我想做的事,还有其他我错过的方法吗?我是否遗漏了一些注意事项?

    这很容易从
    异步io
    完成

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


    这允许您使用
    read\u with
    write\u with

    执行自定义异步操作大多数运行时都有一种方法可以通过在单独的线程上运行来处理阻塞任务。请看@IbraheemAhmed谢谢,我知道这一点(这是我列表中(3)的假设机制)。这一点与我后来了解到的当前东京战略类似。在
    异步io
    的情况下,反应器在哪里运行?(比如,它在某种程度上依赖于运行时吗?)在
    Async
    上有一个文档段落:“但是,不要将Async与File、Stdin、Stdout或Stderr等类型一起使用,因为所有操作系统在非阻塞模式下都会出现问题。”
    Async io
    生成自己的reactor线程,因此,它不依赖于特定的运行时/执行器。它本身也是用于
    异步std
    的反应器。如果您的fd是从UIO设备通过
    open()。文件的问题在于将数据存储在文件系统上的“真实”文件。为了让未来的读者更加完整:Tokio对reactor采取了不同的方法,因为它在执行线程中运行。哪个更好取决于用例。