1
是否应该使用同步角色,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池。