rust 什么时候应该使用时雄的'spawn_blocking'?

p1tboqfb  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(120)

task文档中,有一节讨论了在异步中调用阻塞代码,以及如何避免这种情况,以免过多地阻塞异步线程(https://docs.rs/tokio/1.21.2/tokio/task/index.html#blocking-and-yielding)。
它还谈到了使用tokio::task::spawn_blocking来完成这些任务,但我想知道在什么时候建议将工作发送到不同的线程?我目前正在编写一个程序,它恢复大量的ecdsa签名,每个消息大约需要100微秒,同时执行大量的网络IO。作为一个具体的例子,这足以使用像spawn_blocking这样的东西吗?

sgtfey8w

sgtfey8w1#

Alice Rhyl(时雄开发人员之一)在异步代码中的阻塞方面有很好的blog post
您的问题的关键部分之一:
为了给予人一种多少时间是太多的感觉,一个好的经验法则是每个等待之间不超过10到100微秒。也就是说,这取决于您编写的应用程序的类型。
考虑到您要为每条消息 * 花费100微秒,我认为您很可能已经到了需要转移到另一个线程的时候了。
这篇文章还提供了一个经验法则,说明如何将工作转移到不同的线程上:

  • 对于同步IO,请使用spawn_blocking
  • 对于CPU密集型计算,请使用单独的fork-join线程池,如rayon
  • 对于永远运行的同步工作(例如,监听数据库连接),请生成您自己的专用线程,以避免从时雄/Rayon池中取走一个线程。

相关问题