【发布时间】:2021-07-31 03:30:10
【问题描述】:
我晚上使用 pg_cron 扩展在我的 postgres 数据库上运行一些自动化任务。我正在将某些旧记录移动到存档数据库表中。我在 5 个不同的后台工作人员同时运行 5 个存储过程,因此它们都同时启动并在不同的工作人员上运行(我假设这类似于在 Java 中的不同线程上运行不同的任务) .这 5 个存储过程是独立的(将记录移动到归档表中),因此它们可以同时运行。我使用类似的命令安排他们每个人
cron.schedule (myJob1,
'* * * * *',
'call my_stored_proc_1()'
);
cron.schedule (myJob2,
'* * * * *',
'call my_stored_proc_2()'
);
.
..
...
cron.schedule (myJob5,
'* * * * *',
'call my_stored_proc_5()'
);
现在,我想运行一些更多 依赖存储过程。但是他们需要在这 5 个作业完成/完成后运行,因为他们正在执行一些 DELETE... sql 操作。
如何让第二个存储过程(执行 DELETE 查询的那个)作业在我的前 5 个存储过程作业完成后运行?我不想设置 CRON 表达式对于第二个存储过程执行 DELETES,因为我不知道前 5 个存储过程什么时候完成...
【问题讨论】:
-
我会让 cron 函数依赖于数据。所以该函数启动,检查条件是否运行,如果条件不满足则退出,如果条件满足则执行。这样就可以实现任何复杂的依赖逻辑。您可以检查服务器的状况:是否已加载,是否有锁,是否有其他进程在服务器上运行。 Cron 计划本身变得不那么重要了。为这些任务创建日志。遗憾的是,postgresql 中没有完全针对日志的自治事务。
-
但是在前 5 个并发运行之后,我将如何为我想要运行的第二个 Cron 作业执行此操作???我有 Cron 设置每天晚上运行@1am...所以即使我在 SECOND Cron 作业中添加一个条件语句,这样它在前 5 个完成之前不会运行...它甚至会如何重新自己触发???
-
啊哈。假设前 5 个任务每个都必须在日志中写入一条记录:
{log_id, task_type, start_time, finish_time}。然后,启动时的 SECOND cron 作业检查他们所做的所有 5 个任务中是否存在 5 条记录。虽然它没有看到 - 退出,但当它看到所有以前的任务都完成工作时 - 开始工作 -
所以它就像函数 6 开始时的
SELECT [condition 1] AND [condition 2] AND [condition 3] .. [condition 5] AS do_work。然后如果do_work为 True - 你开始执行
标签: postgresql cron plpgsql pg-cron