python-3.x - 如何使用 PyGreSQL 执行并行查询?
问题描述
我正在尝试与 PyGreSQL 和多处理并行运行多个查询,但下面的代码挂起而不返回:
from pg import DB
from multiprocessing import Pool
from functools import partial
def create_query(table_name):
return f"""create table {table_name} (id integer);
CREATE INDEX ON {table_name} USING BTREE (id);"""
my_queries = [ create_query('foo'), create_query('bar'), create_query('baz') ]
def execute_query(conn_string, query):
con = DB(conn_string)
con.query(query)
con.close()
rs_conn_string = "host=localhost port=5432 dbname=postgres user=postgres password="
pool = Pool(processes=len(my_queries))
pool.map(partial(execute_query,rs_conn_string), my_queries)
有什么办法让它工作吗?如果一个查询失败而另一个查询回滚,是否可以在同一个“事务”中进行 3 个正在运行的查询?
解决方案
一个明显的问题是,您总是运行pool.map
,不仅在主进程中,而且在并行子进程中使用的解释器导入脚本时。你应该这样做:
def run_all():
with Pool(processes=len(my_queries)) as pool:
pool.map(partial(execute_query,rs_conn_string), my_queries)
if __name__ == '__main__':
run_all()
关于您的第二个问题,这是不可能的,因为事务是每个连接的,如果您这样做,它们将存在于单独的进程中。
推荐阅读
- r - R 中 h2o 包中的 predict.H2OModel() 是否为 h2o.randomForest() 模型提供 OOB 预测?
- javascript - JavaScript 函数中的 switch 语句未激活
- sql - SQL Server:视图中的 LAG - 性能缓慢
- ios - UITableViewCell 上不显示内容视图
- python - 如何使用 atomac.launchAppByBundlePath 打开 FileMaker 13 Advanced?
- php - Cpanel 递归 php.ini
- python - 链接 groupby 并应用 pandas
- android - 使用配置文件发布移动(React Native)工件
- python - 将变量传递到xpath selenium,Python
- java - 转换为 Scala 的 Java 泛型类型不接受超类本身