【问题标题】:subprocess vs asyncio for asynchronous postgresql queries用于异步 postgresql 查询的子进程 vs asyncio
【发布时间】:2019-05-31 06:32:10
【问题描述】:

我想在 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?它对上面讨论的方法有什么好处吗?

【问题讨论】:

    标签: python postgresql subprocess python-asyncio


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多