Postgres bgworker

发布时间:2026/11/7 12:39:01

Postgres bgworker 路径一RegisterBackgroundWorker静态注册入口bgworker.c:871-943调用方在shared_preload_libraries加载的模块的_PG_init()函数中调用调用流程RegisterBackgroundWorker(worker) [bgworker.c:871] │ ├─ 1. 检查 IsUnderPostmaster → false此时 postmaster 刚启动 ├─ 2. 检查是否在 shared_preload_libraries 加载期间 ├─ 3. SanityCheckBackgroundWorker(worker) [bgworker.c:652] ├─ 4. 拒绝 bgw_notify_pid ! 0静态注册不允许通知 ├─ 5. 检查 numworkers max_worker_processes ├─ 6. malloc RegisteredBgWorker拷贝 worker 数据 └─ 7. slist_push_head(BackgroundWorkerList, rw-rw_lnode) ← 直接加入 postmaster 私有链表后续处理PostmasterMain() [postmaster.c:1480] │ ├─ BackgroundWorkerShmemInit() [bgworker.c:158] │ └─ 遍历 BackgroundWorkerList将每个 rw 拷贝到共享内存 │ BackgroundWorkerData-slot[slotno].worker │ 并记录 rw-rw_shmem_slot slotno │ └─ maybe_start_bgworkers() [postmaster.c:5966] └─ 遍历 BackgroundWorkerList检查启动条件 └─ do_start_bgworker(rw) [postmaster.c:5768] ├─ fork_process() / bgworker_forkexec() ← fork 子进程 ├─ child: StartBackgroundWorker() [bgworker.c:741] └─ parent: 记录 rw_pid, ReportBackgroundWorkerPID()路径二RegisterDynamicBackgroundWorker动态注册入口bgworker.c:955-1048调用方普通 backend 进程如并行查询需要启动 parallel worker 时调用流程RegisterDynamicBackgroundWorker(worker, handle) [bgworker.c:956] │ ├─ 1. 检查 IsUnderPostmaster → true必须在 backend 中调用 ├─ 2. SanityCheckBackgroundWorker(worker, ERROR) ├─ 3. LWLockAcquire(BackgroundWorkerLock, LW_EXCLUSIVE) ├─ 4. 遍历 BackgroundWorkerData-slot[] 找空闲 slotin_use false ├─ 5. 将 worker 数据 memcpy 到 slot-worker ├─ 6. 设置 slot-pid InvalidPid, slot-generation ├─ 7. pg_write_barrier() → slot-in_use true ← 写内存屏障保证可见性 ├─ 8. LWLockRelease(BackgroundWorkerLock) ├─ 9. SendPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE) ← 通知 postmaster └─ 10. 返回 handle含 slotno generationPostmaster 侧响应ServerLoop() [postmaster.c:1888] │ ├─ 检测信号: │ CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE) │ └─ BackgroundWorkerStateChange(allow_new_workers) [bgworker.c:242] │ │ │ ├─ 遍历 BackgroundWorkerData-slot[] 所有 slot │ ├─ 找到 in_usetrue 但不在 BackgroundWorkerList 中的新 slot │ ├─ 从共享内存 slot-worker 拷贝数据到新的 RegisteredBgWorker │ ├─ 验证 bgw_notify_pid 有效性 │ └─ slist_push_head(BackgroundWorkerList, rw-rw_lnode) │ └─ maybe_start_bgworkers() [postmaster.c:5966] └─ 遍历 BackgroundWorkerList └─ do_start_bgworker(rw) [postmaster.c:5768] ├─ fork_process() ├─ child: StartBackgroundWorker() [bgworker.c:741] └─ parent: rw-rw_pid worker_pidStartBackgroundWorker被调用的两个位置StartBackgroundWorker()在子进程中执行有两个调用点场景位置说明非 EXEC_BACKEND(Unix)postmaster.c:5834fork_process()返回 0 后子进程直接调用EXEC_BACKEND(Windows)postmaster.c:5083bgworker_forkexec()→postmaster_forkexec()启动新进程进程入口SubPostmasterMain()解析--forkbgworkerN参数后调用StartBackgroundWorker内部做了什么bgworker.c:741-862设置IsBackgroundWorker true设置信号处理函数根据是否带数据库连接选择不同的 handler设置sigsetjmp异常处理InitProcess()— 创建 PGPROC 结构BaseInit()— 基础初始化LookupBackgroundWorkerFunction()— 加载动态库查找入口函数entrypt(worker-bgw_main_arg)—调用用户定义的主函数proc_exit(0)— 正常退出关键区别总结维度RegisterBackgroundWorkerRegisterDynamicBackgroundWorker调用时机postmaster 启动期间 (_PG_init)系统运行期间任意 backend调用环境!IsUnderPostmasterIsUnderPostmaster注册位置直接写入 postmaster 私有链表写入共享内存 slot通知机制无需通知postmaster 启动时自然感知SendPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE)postmaster 感知BackgroundWorkerShmemInit()时顺带处理BackgroundWorkerStateChange()扫描共享内存bgw_notify_pid不支持必须是 0支持用于通知调用进程 worker 状态变化并发控制无需单进程启动阶段BackgroundWorkerLock(LWLock)最终启动✅ 都是通过maybe_start_bgworkers()→do_start_bgworker()→StartBackgroundWorker()
延伸阅读

更多相关文章

2026/10/24 11:33:42

Python列表操作全解析:从基础到高级技巧

1. Python列表基础概念与特性Python列表(List)是Python中最基础且强大的数据结构之一,它就像是一个可以装下任何东西的"魔法口袋"。想象一下你去超市购物时用的购物车——可以放入水果、蔬菜、日用品等各种不同类型的商品,Python列表也是如此灵…

2026/11/7 4:25:25

Go语言Context核心机制与应用实践

1. Context在Go语言中的核心作用Context是Go语言标准库中一个极其重要的包,它定义了Context类型,用于在API边界和进程之间传递截止时间、取消信号以及其他请求范围的值。在实际开发中,Context主要解决以下几个关键问题:跨API边界的…

2026/10/30 16:48:33

Windows官方镜像获取与使用全指南

1. 各版本Windows官方镜像获取指南对于需要重装系统或搭建虚拟机的用户来说,获取纯净的官方系统镜像是首要任务。微软其实为所有主流Windows版本都提供了官方下载渠道,只是不同版本的获取方式有所差异。1.1 Windows 11官方镜像获取目前最直接的方式是通过…

2026/11/7 12:34:17

东莞常平电工证补办别怕学历不高,电子证书也能轻松拿

东莞常平电工证补办别怕学历不高,电子证书也能轻松拿 学历不高怕报不上名?东莞常平电工证补办其实没那么难,电子证书已经成为主流,只要流程走对,资料准备齐全,完全不用担心。今天就通过一个真实案例,带大家了解电工证补办的全过程,包括证书变更、注销…

2026/11/7 12:34:17

东莞常平电工证补办怎么操作?上岗必备流程全解析

东莞常平电工证补办怎么操作?上岗必备流程全解析 工地太忙根本没时间复习考试,东莞常平的电工证补办成了不少工友的心头事。特别是对于在建筑、电力、安装等行业打拼的电工来说, 上岗必备…

2026/11/7 12:34:17

象州考电工证2026河南最新政策怎么应对证书过期问题

象州考电工证2026河南最新政策怎么应对证书过期问题 证书过期了不知道怎么复审延期?这事儿真不是小事,尤其是2026河南最新政策出台后,很多电工持证人都懵了。你不是一个人在战斗,很多人都在为电工证复审头疼。别慌,这篇文章就是为你准备的,教你…

2026/11/7 12:34:17

广州电工证考试合格怎么准备?2026河南最新政策有啥变化

广州电工证考试合格怎么准备?2026河南最新政策有啥变化 实操考试心里没底怕挂科?广州电工证考试合格是不少从业者关心的话题,尤其是2026年河南最新政策出台后,考试流程、内容和资格审核都有了新的变化。很多人担心新规会增加考试难度,但只要掌握…

2026/11/7 12:34:16

黄山电工证报名有效期多久?考前押题帮你轻松应对复审

黄山电工证报名有效期多久?考前押题帮你轻松应对复审 证书过期了不知道怎么复审延期?你不是一个人,这是很多电工从业者都遇到过的头疼问题。黄山电工证报名虽然看似简单,但一旦证书有效期过了,很多人却不知道怎么操作,甚至因此耽误了工作机会。特别是现…

2026/11/7 12:29:16

济阳电工证报名不复习怎么过?考前押题救你忙中抽闲

济阳电工证报名不复习怎么过?考前押题救你忙中抽闲 工地太忙根本没时间复习考试,尤其是像我们这些一线工人,天天在工地上跑,哪还有心思去背那些理论知识?但偏偏电工证是必须的, 济阳电工证报名 不是你想考就能考的, 考前押题…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/6 10:49:01

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/7 0:03:08

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。特别是在郑州这样的城市,很多施工企业负责人和一线作业人员在报考电工证和钳工证时都面临着同样的困惑。到底该考哪个证?哪个更适合自己?哪个证书…

2026/11/7 0:03:08

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱?

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这个问题我遇到太多了,今天就拿广西电工证办理流程来具体说说,别再走弯路了。广西电工证的报考、复审、继续教育这些环节,如果你不了解,真的会吃大亏,尤其对于从…

2026/11/7 0:03:08

电气电工证都有哪些保姆级教程

电气电工证都有哪些保姆级教程 你是不是正愁不知道去哪报名,怕被中介坑?别急,这篇保姆级教程专为河南初次报考人员准备,帮你搞清楚 电气电工证都有哪些 ,以及如何避开那些坑。 电气电工证都有哪些?别被五花八门的证书搞懵了…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/6 10:49:01

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑