问题基准 actix_web api 与标准

Trouble Benchmarking actix_web api with Criterion

我一直在尝试使用 Criterion crate to my actix_web application. I have been struggling to get it to work because the AsyncExecutor trait is not implemented for tokio 0.2.x. I tried implementing the trait for the actix_rt 运行时添加基准测试,但 运行 也存在问题,代码如下

impl AsyncExecutor for ActixRuntime {
    fn block_on<T>(&self, future: impl Future<Output=T>) -> T {
        self.rt.block_on(future)
    }
}

pub struct ActixRuntime {
    rt: actix_rt::Runtime,
}

impl ActixRuntime {
    pub fn new() -> Self {
        ActixRuntime {
            rt: actix_rt::Runtime::new().unwrap(),
        }
    }
}

这会出错,因为 block_on 函数 actix_rt (and tokio 0.2.x) 的签名为 block_on(&mut self, ...) -> ... { ... } 所以我无法实现该特征,因为该特征具有不可变的引用。

在我进一步深入尝试完成这项工作之前,我想问一下我的尝试是否可行。有没有办法使用Criterion with actix?还是现在这是不可能的?如果不可能,是否有任何其他框架可用,或者我应该看看 Rust 工具链之外的解决方案?

感谢您提供任何建议或帮助,欢迎提供链接和示例!

干杯!

actix-rt v2 的 block_on 方法现在需要 &self after upgrading to tokio 1.0。升级应该可以解决您的问题:

// pin your deps: https://github.com/actix/actix-web/issues/1944
actix-rt = "=2.0.0-beta.2"
actix-web = "4.0.0-beta.1"
actix-service = "=2.0.0-beta.3"

如果升级不是一个选项,您可以使用内部可变性包装器,例如 RefCell:

impl AsyncExecutor for ActixRuntime {
    fn block_on<T>(&self, future: impl Future<Output=T>) -> T {
        self.rt.borrow_mut().block_on(future)
    }
}

pub struct ActixRuntime {
    rt: RefCell<actix_rt::Runtime>,
}

impl ActixRuntime {
    pub fn new() -> Self {
        ActixRuntime {
            rt: RefCell::new(actix_rt::Runtime::new().unwrap())
        }
    }

似乎没有什么好办法。没有支持 actix_rt 2.0.x 的稳定 actix 版本(尽管它会修复 AsyncExecutor 中的可变性冲突)。截至目前,actix-web 4.0.x 处于测试阶段,对于我现有的应用程序来说太不稳定了(使用时会导致各种问题)。现在,我将等到 actix-web 4.0.0 发布并稳定后才能为我的 api.

实施基准测试