从Tokio应用程序中使用Actix:混合actix_web :: main和tokio :: main?

12

目前,我的主要代码像Reqwest库的异步示例一样编写。

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

我们可以将那个例子用于这里。现在我想基本上添加一个-l<port>的标志来改变我的应用程序的行为,当以这种方式触发时,我希望它侦听端口并运行Web服务器。我想使用Actix Web,其文档如下所示:

#[actix_web::main]
async fn main() -> std::io::Result<()> {

如何将一个用 #[actix_web::main] 修饰的 fn main 和一个用 #[tokio::main] 修饰的 fn main 合成一个,在已使用 Tokio 的应用程序中使用 Actix Web?我找不到任何关于这个问题的文档。我们如何在 Actix Web 服务器中使用 Tokio,以及如何将一个 Tokio 应用程序移植到 Actix Web 应用程序中?


请查看https://github.com/actix/examples/blob/master/basics/run-in-thread/src/main.rs。 - Njuguna Mureithi
我怀疑你不能有多个主函数,因为只能有一个主入口。 - Njuguna Mureithi
你不能有多个 main 函数,但由于 Actix 本身运行在 Tokio 上,因此可能有一种方法告诉 Actix 使用现有的 Tokio 运行时而不是启动自己的运行时。 - Jmb
@NjugunaMureithi 这里是更新后的链接 https://github.com/actix/examples/blob/master/run-in-thread/src/main.rs - neoneye
1个回答

16

由于Actix-web内部使用Tokio,当您使用#[actix_web::main]时,您将能够像使用#[tokio::main]一样使用所有常规的Tokio工具。

但是请注意,您需要正确匹配Tokio的版本。 Actix-web版本3.x.y使用Tokio 0.2.x,因此在使用该版本的Actix时,您需要使用适用于该版本Tokio的工具。要使用最新版本的Tokio,则需要使用Actix-web的4.0.0-beta.x版本。

Actix-web 4正式版发布后,可以随时编辑此答案。


1
谢谢!这里留下一些线索...我正在使用 Actix-Web 3 和 reqwest 0.11,但是出现了错误 thread 'actix-rt:worker:2' panicked at 'there is no reactor running, must be called from the context of a Tokio 1.x runtime' - Tillerino
1
Actix-web现已正式版发布。以下是一些有用的链接:Github的问题跟踪页面迁移指南 - TDiblik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接