在 plpgsql 过程/函数中使用 "pg_sleep" 同时使用多个工作线程后台进程是否是一种不良做法?



我正在运行多个后台工作进程在我的Postgres数据库。我使用Pg_Cron扩展。不幸的是,我不能像这里的另一个用户建议的那样使用pg_schedules。

因此,我有5个独立的"工作"。在开始之前,需要另外一个独立的过程/函数来执行和完成。我最初只是每隔30分钟左右检查一次我的Cron工作,有些"job_log"。为了查看独立作业是否完成(即如果yes)而创建的表,执行程序,如果不是返回退出程序,并在下一个Cron间隔检查)

然而,我相信我可以大大简化我触发/协调所有这些作业/程序的方式如果我使用pg_sleep并在一次启动所有作业(所以不用每隔30分钟查看一次)。我将在夜间同时运行这些作业,因此我认为它不应该对实际流量产生那么大的影响。

WHILE some_variable != some_condition LOOP
PERFORM pg_sleep(1);
some_variable := some_value; -- update variable here
END LOOP;

我的问题是

  1. 一次启动所有这些作业(即在Cron表达式中设置具体时间,例如15 18 * * *),并使用pg_sleep还是实践/低效,因为我将闲置5个后台工人,而1个工作完成。这些依赖的1个工作可能需要任何时间来完成,即15分钟,30分钟,1小时(应该是<</li>

或者最好只是使用Cron表达式每5分钟检查一次主/独立作业是否完成,这样我的其他依赖作业就可以运行了?

运行两个调度程序,其中一个是自制的,似乎比运行一个调度程序做2(或6,1+5,无论你怎么计算)不同的事情更复杂。如果你的目标是让事情变得更简单,你的提议真的实现了吗?

我不会担心5个后端同时在pg_sleep上睡觉。但你可能会担心,当它们这样做的时候,它们会挡住视野,这会降低真空和热修剪的效果。但是如果你已经在一个快照中有一个长时间运行的任务(它们正在等待的事情),那么更多的任务不会使事情变得更糟。

相关内容

  • 没有找到相关文章

最新更新