Rust diesel应该使用sync actor、actix_web::web::block还是futures cpupool运行? 背景

Rust diesel应该使用sync actor、actix_web::web::block还是futures cpupool运行? 背景,rust,rust-diesel,actix-web,Rust,Rust Diesel,Actix Web,我正在使用diesel通过r2d2开发一个actix web应用程序,不确定如何最好地进行异步查询。我发现了三个似乎合理的选择,但我不确定哪一个是最好的 潜在解决方案 同步演员 其中一个我可以使用,但它相当复杂,需要大量的样板文件来构建。我希望有一个更合理的解决办法 Actix\u web::web::block 作为另一种选择,我可以使用将我的查询函数包装到未来,但我不确定这对性能的影响 那么查询是否在同一个Tokio系统中运行?根据我在资料中所能找到的资料。这是个问题吗 如果我读对了代码,r

我正在使用diesel通过r2d2开发一个actix web应用程序,不确定如何最好地进行异步查询。我发现了三个似乎合理的选择,但我不确定哪一个是最好的

潜在解决方案 同步演员 其中一个我可以使用,但它相当复杂,需要大量的样板文件来构建。我希望有一个更合理的解决办法

Actix\u web::web::block
作为另一种选择,我可以使用将我的查询函数包装到未来,但我不确定这对性能的影响

那么查询是否在同一个Tokio系统中运行?根据我在资料中所能找到的资料。这是个问题吗

如果我读对了代码,r2d2在获取连接时会阻塞其线程,这将阻塞核心actix web池的一部分。数据库查询也是如此。如果我做的查询比池中的线程多,那么这将阻止所有actix web?如果是的话,那就是一个大问题

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

因为r2d2和柴油机都会阻塞,所以这里有很多棘手的事情

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

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

最后,请注意您正在使用的数据库及其性能。运行单个连接r2d2和池中的单个线程可能是编写量大的sqlite应用程序的最佳选择(尽管我建议为此类应用程序使用合适的数据库)

旧答案 可能有效的旧解决方案

从本质上说,cpupool是一种新的工具

建议在一般情况下使用cpupool

不起作用的旧解决方案


对于旧的actix web版本来说,这是一个非常好的修复。据我所知,请求中不再有cpu池。

我将使用futures cpupool。这是最好的解决方案,因为我的交互具有阻塞性

使用actix_web::web::block已经足够好了,但是将在actix中使用共享线程池(由于我使用的阻塞调用,这可能会阻塞整个线程池,并干扰提供给actix_web的其他任务)

最好使用futures cpupool为每个数据库创建一个单独的线程池,仅用于数据库交互。通过这种方式,您可以将需要相互等待的所有任务(当任务多于连接时)分组到一个池中,以防止它们阻止任何不需要连接的其他任务,并可能将线程数限制为连接数(这样,任务将仅在不被阻止时进行调度)


如果您只想使用一个数据库连接(或很少使用),那么sync actor是一个不错的选择。它将像一个带有一个线程的未来cpupool,确保所有任务一次运行一个,但它将使用actixweb的一个底层线程,而不是单独的线程(因此,只适用于极少数连接)。不过,我觉得这个样板太大了,不值得这么做。

从中的评论中可以看出,
futures cpupool
是柴油机中缺少
async
支持的推荐解决方案。这更像是一个通用的解决方案。我希望能够利用actix系统。尽管如此,我现在将深入研究futures cpupool以查找问题。欢迎使用堆栈溢出!看起来你的问题可能会由你的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将这个问题标记为已回答。由于cpupool还与r2d2中的阻塞连接池交互,我不确定如何最好地解决这个问题。我现在正在自己研究,并将很快更新。阅读我的上述发现-请在答案中输入与答案相关的信息,而不是问题。您建议的人才库规模是多少?