0

我有一个主要的 Tokio 运行时,以及一些使用reqwest.

我遇到的一个问题是主事件循环可能会阻塞一段时间,这会使 HTTP 请求变慢,直到超时。

当我的代码在主事件循环中运行时,我无法同时创建两个运行时。

Tokio 阻止您从第一个(嵌套)运行时创建第二个运行时。

tokio::task::spawn_blockingwithexecutor::block_on(http_call_fut)似乎没有帮助 - 被阻塞的主事件循环似乎减慢了 HTTP 请求,无论它们在哪里运行。我假设 Tokio 的调度程序逻辑在阻塞时不起作用。


如何将我的 HTTP 请求与可能阻塞的主事件循环隔离开来?

我希望它们全速完成,然后让完成的未来在内存中等待,直到它可以被主事件循环读取。

4

1 回答 1

0

是的,您不应该在 Tokio 管理的线程中运行阻塞工作。

如果您有一些阻塞工作,一个选项是创建一个 OS 线程 ( std::thread::spawn),从那里运行阻塞工作,然后将结果返回给 Tokio 的任务。或者使用也使用专用线程的spawn_blocking 。

结果可以通过一些tokio::sync原语(例如通道)进行通信,并且您可以在事件循环中一次使用select!或执行多项操作。StreamMap例如,这允许在等待阻塞任务结果的同时等待不相关的 HTTP 请求。

于 2021-11-27T23:00:17.047 回答