首页 > 解决方案 > 用于异步 postgresql 查询的子进程 vs asyncio

问题描述

我想在 postgresql 数据库上执行一些操作。这些操作对表执行选择,然后将结果行插入到具有主键的新表中,忽略违反主键约束的行。数据库中有大量的大表需要处理,看来这种任务应该异步运行。

让我感到震惊的是,解决此问题的一种方法是使用subprocessPython 中的模块来运行执行这些操作的 bash 脚本,使用类似subprocess.Popen. 我可以打开许多终端会话并并行执行查询,据我了解,这种方法正在模仿这一点。

这里借一个例子:

from subprocess import Popen, PIPE
import glob

f_list = glob.glob('./*bz2')
cmds_list = [['./bunzip2_file.py', file_name] for file_name in f_list]
procs_list = [Popen(cmd, stdout=PIPE, stderr=PIPE) for cmd in cmds_list]
for proc in procs_list:
    proc.wait()

我的问题是:

  1. 使用调用许多 postgres 查询是否有任何明显的问题subprocess

  2. 在什么情况下我可以考虑使用asyncio?它对上面讨论的方法有什么好处吗?

标签: pythonpostgresqlsubprocesspython-asyncio

解决方案


请注意,这asyncio本身首先是关于控制执行流程。这意味着,例如,您可以使用 asyncio 灵活地管理子流程。所以你的问题实际上是关于使用进程与 PostgreSQL 异步驱动程序。

首先,您可能不需要进程:如果您的 bash 脚本不包含太多计算,您可以使用线程,它们更便宜。

当谈到asyncio与线程时,两者都解决了主要的性能瓶颈 - 网络 I/O。除非您生成数千个线程,否则您可能不会看到任何性能差异(请参阅此问题答案以获取示例)。


推荐阅读