子流程与异步异步查询的asyncio

时间:2019-01-04 16:56:24

标签: python postgresql subprocess python-asyncio

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

让我吃惊的是,一种解决方法是使用Python中的subprocess模块来运行bash脚本,这些脚本使用subprocess.Popen之类的东西来执行这些操作。我可以打开许多终端会话并并行执行查询,据我所知,这种方法就是在模仿这一点。

要借用here的示例:

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. 使用subprocess调用许多postgres查询是否存在明显的问题?

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

1 个答案:

答案 0 :(得分:0)

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

首先,您可能不需要处理程序:如果您的bash脚本包含的计算量不大,您可以use threads,那么它们会更便宜。

与线程相比,asyncio可以解决主要的性能瓶颈-网络I / O。除非您生成了数千个线程,否则您可能看不到任何性能差异(有关示例,请参见此questionanswer)。