5

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

我正在阅读Folly库中两个异步执行器池、IOThreadPoolExecutor绑定io任务和CPUThreadPoolExecutor绑定cpu任务的文档(https://github.com/facebook/folly/blob/master/folly/docs/Executors.md)。

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

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

4

1 回答 1

8

仅当您需要 EventBase 池时,才应使用高级别的 IPThreadPoolExecutors。如果您需要一个工作池,请使用 CPUThreadPoolExecutor。

CPUThreadPoolExecutor

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

cpu线程池执行器

IOThreadPoolExecutor

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

在此处输入图像描述

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

于 2021-05-11T16:18:50.517 回答