python - 用于异步 postgresql 查询的子进程 vs asyncio
问题描述
我想在 postgresql 数据库上执行一些操作。这些操作对表执行选择,然后将结果行插入到具有主键的新表中,忽略违反主键约束的行。数据库中有大量的大表需要处理,看来这种任务应该异步运行。
让我感到震惊的是,解决此问题的一种方法是使用subprocess
Python 中的模块来运行执行这些操作的 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()
我的问题是:
使用调用许多 postgres 查询是否有任何明显的问题
subprocess
?在什么情况下我可以考虑使用
asyncio
?它对上面讨论的方法有什么好处吗?
解决方案
请注意,这asyncio
本身首先是关于控制执行流程。这意味着,例如,您可以使用 asyncio 灵活地管理子流程。所以你的问题实际上是关于使用进程与 PostgreSQL 异步驱动程序。
首先,您可能不需要进程:如果您的 bash 脚本不包含太多计算,您可以使用线程,它们更便宜。
当谈到asyncio
与线程时,两者都解决了主要的性能瓶颈 - 网络 I/O。除非您生成数千个线程,否则您可能不会看到任何性能差异(请参阅此问题和答案以获取示例)。
推荐阅读
- javascript - 类型“JQuery”上不存在属性“掩码”
- sql - PostgreSQL - 每个 id 的最大值
- json - EasyPost 是否有任何文档显示请求的原始 JSON,包括标头?或者例如邮递员系列?
- swift - SwiftUI ViewModifier - 添加字距调整
- excel - 从 VBA 将公式插入 Excel 时小数更改为逗号
- javascript - 增加和减少检查不工作的10、100、1000等等
- machine-learning - Python中的多元线性回归机器学习--ValueError:形状(8,15)和(390,)未对齐
- java - 在片段微调器中获取空值
- android - Android:错误:原因:未指定compileSdkVersion
- r - 将斜率线添加到 R 中循环中的线性模型