愚蠢的 IOThreadPoolExecutor 与 CPUThreadPoolExecutor

Sam*_* Hu 5 c++ linux folly

我正在尝试更多地了解我正在处理的这个代码库使用的异步抽象。

我读Folly的文档两个异步执行池库,IOThreadPoolExecutor用于io绑定的任务,并CPUThreadPoolExecutorcpu密集型任务(https://github.com/facebook/folly/blob/master/folly/docs/Executors.md)。

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

但这并没有告诉我太多的好处和权衡。

pre*_*mba 5

在高级别的 IPThreadPoolExecutors 应该仅在您需要 EventBase 池时使用。如果你需要一个工作池,那么使用 CPUThreadPoolExecutor。

CPU线程池执行器

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

cpu线程池执行器

IOThreadPoolExecutor

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

在此处输入图片说明

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