愚蠢的 IOThreadPoolExecutor 与 CPUThreadPoolExecutor

folly IOThreadPoolExecutor vs CPUThreadPoolExecutor

我正在尝试了解有关我正在处理的代码库使用的异步抽象的更多信息。

我正在阅读 Folly 库中两个异步执行程序池的文档,IOThreadPoolExecutor 用于 io 绑定任务,CPUThreadPoolExecutor 用于 [=14] =]绑定任务(https://github.com/facebook/folly/blob/master/folly/docs/Executors.md).

我正在阅读说明,但我不明白主要区别。似乎 IOThreadPoolExecutor 是围绕 event_fdepoll 循环构建的,而 CPUThreadPoolExecutor 使用队列和信号量。

但这并没有告诉我太多关于收益和权衡的信息。

仅当您需要 EventBase 池时才应使用 IPThreadPoolExecutors。如果你需要一个工作池,那么使用 CPUThreadPoolExecutor。

CPUThreadPoolExecutor

包含一系列优先队列,这些队列不断被一系列工作人员拾取。每个工作线程在创建后执行 threadRun()。 ThreadRun() 本质上是一个无限循环,它从任务队列中拉出一个任务并执行它。如果任务在获取时已经过期,则执行过期回调而不是任务本身。

IOThreadPoolExecutor

每个 IO 线程都运行自己的 EventBase。 IOThreadPoolExecutor 不是像 CPUThreadPoolExecutor 那样从任务队列中拉取任务,而是将一个事件注册到下一个 IO 线程的 EventBase 中。然后每个 IO 线程为其 EventBase 调用 loopForEver(),这实质上是调用 epoll() 来执行异步 io。

所以大多数时候您可能应该使用 CPUThreadPoolExecutor,因为这是拥有工作池的常见用例。