【问题标题】:How to make a Postgres background workers sleep and wake up on a signal?如何让 Postgres 后台工作人员在收到信号时睡觉和醒来?
【发布时间】:2020-03-04 22:58:47
【问题描述】:

PostgreSQL 使用background workers 来允许进程以并发方式工作,并且它们具有供后端/扩展开发人员控制它们的 API。到目前为止,我已经成功地在一个演示扩展中使用了这个功能,成功地产生了一些工人。

我的一名工人必须等待另一名工人完成。到目前为止,我正在做的是一个空闲工作人员的无限循环,直到正在等待的工作人员完成,这可能是非常低效的。所以我想知道如何让空闲进程休眠,直到发送一些信号?我会寻找什么?是否有类似的扩展程序可以用于指导?

【问题讨论】:

  • 什么样的信号?是signal(2)吗?还是别的什么?你读过select(2)/poll(2)之类的功能吗?如果你使用的是 Linux,你也可以使用eventfd(2)..
  • 不是指任何特定的信号,而是指 PostgreSQL API 后端中可用的东西,以帮助我实现我的目标(如果有的话)。感谢您的建议,如果 PostgreSQL 后端不提供此类功能,我会尝试使用它们。

标签: c postgresql postgresql-12 postgresql-extensions


【解决方案1】:

我认为执行此类操作的官方方法是使用条件变量,在文件 src/backend/storage/lmgr/condition_variable.c 中实现

我没有看到它在任何“contrib”扩展中使用,但是,只是核心代码。

【讨论】:

    【解决方案2】:

    您可以使用咨询锁。它们与交易无关。

    另一种选择是使用后端可用的“轻量级锁”(LWlock),也就是闩锁。

    【讨论】:

    • 我发现 /src/backend/storage/lmgr/condition_variable.c 文件有我想要的,但我仍在尝试评估 LWlock 作为一个选项。我正在努力从代码中理解 LWlocks 是什么。您能帮我了解 LWlock 与自旋锁有何不同,或者 LWlock 在哪些方面是“轻量级”的?
    • 使用自旋锁,等待进程不会放弃CPU,而是执行“忙等待”。这对于保证持有非常时间的锁很有用。轻量级锁避免了您可以从 SQL 中使用的重量级锁的全部机制。例如,不涉及死锁检测器。
    • 非常感谢!现在更清楚了,帮助很大。但是,我必须接受条件变量作为原始问题的答案,因为它最接近我正在寻找的机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多