如何在 Postgres 中异步运行代码块(如作业)?

Posted

技术标签:

【中文标题】如何在 Postgres 中异步运行代码块(如作业)?【英文标题】:How to run block of code in Postgres asynchronously (like a job)? 【发布时间】:2021-07-01 15:28:55 【问题描述】:

我们可以在当前会话之外执行一段代码吗? 换句话说,将执行委托给另一个工作线程,类似于 Oracle 中的 dbms_job.submit

我只找到了涉及 Cron 等外部工具的解决方案,但没有看到任何使用 PostgreSQL DBMS 本身的选项。

我想在不阻塞当前会话的情况下运行的简单长运行块示例:

DO
$do$
begin
   FOR i IN 1..1000000
   loop
      // some long running inserts
      insert into my_table(x) values (i);
      commit;
   end loop;
end $do$;

【问题讨论】:

你试过pgagent吗? pgadmin.org/docs/pgadmin4/5.0/pgagent_jobs.html @richyen 我不知道如何访问它。在 pgAdmin“帮助/快速搜索”中没有找到“pgAgent”。在 Application Stack Builder 中,我也没有看到安装“pgAgent”的选项。文档没有提供有关安装的足够信息。 您使用的是enterprisedb postgres,还是普通的社区postgres? 【参考方案1】:

您应该看看这个新的 PostgreSQL 扩展 pg_dbms_job,它使用与 dbms_job.submit() 相同的过程实现了 Oracle DBMS_JOB 提供的所有功能。

【讨论】:

【参考方案2】:

您一次只能在一个 PostgreSQL 数据库会话中运行一条语句。解决方案是启动第二个会话:然后一个会话可以执行脚本,您可以在另一个会话中同时执行其他工作。

【讨论】:

完全正确。但我想开始一个长时间运行的语句,关闭我的会话,然后返回并检查结果。作为奖励,它可以防止在工作过程中出现网络故障时连接丢失。 这是一个合理的要求。以nohup psql -f script.sql & 或您操作系统上的任何等效项开始您的脚本。

以上是关于如何在 Postgres 中异步运行代码块(如作业)?的主要内容,如果未能解决你的问题,请参考以下文章

从笔记本运行数据块作业

如何使用 Python 或 Pyspark 或 scala 在数据块中获取笔记本的作业运行结果日志

Datagrip:创建postgres索引而不等待执行

使异步块在其他代码之前运行

tornado异步原理

如何在 Swift 中测量 DispatchQueue 并发异步中的代码块执行时间?