问题基准 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.
实施基准测试
我一直在尝试使用 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.
实施基准测试