小编log*_*ina的帖子

是否应该使用同步角色,actix_web :: web :: block或futures-cpupool运行柴油?

背景

我正在通过r2d2使用柴油的actix-web应用程序上工作,并且不确定如何最好地进行异步查询。我发现了三个看似合理的选择,但不确定哪个是最好的。

潜在解决方案

同步演员

对于我来说,我可以使用actix示例,但是它非常复杂,需要大量样板来构建。我希望有一个更合理的解决方案。

Actix_web::web::block

作为另一种选择,我可以使用将actix_web::web::block查询功能包装到将来,但是我不确定这样做的性能含义。

然后,该查询是否在同一Tokio系统中运行?从我在源代码中可以找到的地方,它在基础的actix-web线程池中创建了一个线程。那是问题吗?

如果我没看错代码,则r2d2在获取连接时会阻塞其线程,这会阻塞部分核心actix-web池。与数据库查询相同。如果我执行的查询多于该池中的线程数,那么这将阻止所有actix-web?如果是这样,那就大问题了。

期货

最后,可能会有一些不必要开销的安全选择是futures-cpupool。主要问题是,这意味着要向我的项目中添加另一个板条箱,尽管我不喜欢不必要地在应用程序中浮动多个cpu池的想法。

由于r2d2和柴油都会阻塞,因此这里有令人惊讶的棘手事情。

最重要的是,不要与不使用同一r2d2池的任何事物共享此cpupool(因为创建的所有线程可能只是阻塞等待r2d2连接,在工作存在时锁定整个池)。

其次(更明显一点),因此您不应该拥有比池中线程更多的r2d2连接,反之亦然,因为更大的r2d2连接会浪费资源(连接未使用/线程不断被阻塞)(也许还有一个线程,也许更快)由OS调度程序而不是cpupool调度程序进行连接切换)。

最后,请注意您正在使用的数据库以及那里的性能。在写繁琐的sqlite应用程序中运行单个连接r2d2和池中的单个线程可能是最好的选择(尽管我会为此推荐一个合适的数据库)。

旧答案

可能有效的旧解决方案

https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/

本质上,建议使用Futures-cpupool。

在future-rs中封装阻塞I / O的最佳方法是什么?

对于一般情况,建议使用Futures-cpupool。

无效的旧解决方案

https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/

对旧的actix-web版本的一个非常好的修复。从我可以找到的请求中,不再有CPU池。

rust rust-diesel actix-web

6
推荐指数
1
解决办法
252
查看次数

标准库中是否有完美的函数或一些推荐的方法来扩展 Rust 中的转义序列?

我正在编写的应用程序中接受用户输入,并希望扩展用户输入的转义序列。

例如,如果用户输入\\n它将被解释为 str \\\\n。我想以一般方式解释该字符串(转换为换行符)和类似的字符串。

我当然可以使用String::replace()最重要的那些,而没有其他人,但我更喜欢一个通用的解决方案,它也可以处理十六进制转义(\x61is a)。

rust

0
推荐指数
1
解决办法
81
查看次数

标签 统计

rust ×2

actix-web ×1

rust-diesel ×1