知识卡片

Finisher解耦异步完成通知与调用线程

专业/工作 · 511.e

内容

Finisher 的结构很简单:一个待执行的 Context 回调队列,加一个专门的 FinisherThread 负责取出并执行这些回调。它存在的意义是把”某个异步操作完成后要做什么”和”是谁、在哪个线程触发的完成”彻底分开——网络线程、磁盘 IO 线程等各种上下文都可以把完成回调丢进 Finisher 的队列,不需要关心回调本身要跑多久、会不会阻塞自己的关键路径,实际执行统一交给 Finisher 自己的线程串行处理。这是异步编程里”生产完成事件”和”消费完成事件”解耦的基本手法。

参考来源

《Ceph源码分析》第2章《Ceph通用模块》