繁体   English   中英

在python中同时多次运行sql查询

[英]Run a sql query multiple times concurrently in python

我正在尝试使用多处理库同时多次执行 sql 语句。 这是我正在使用的脚本,

import time
from multiprocessing import Pool
import psycopg2

rec = []
def make_query(connection):
    cursor = connection.cursor()
    print("conn: %s curs:%s pid=%s" % (id(connection), id(cursor), os.getpid()))
    postgreSQL_select_Query = "select * from users"
    cursor.execute(postgreSQL_select_Query)
    records = cursor.fetchall() 

    for row in records:
        rec.append(row[0])

if __name__ == "__main__":
    connection = psycopg2.connect(user="postgres", password="password", host="127.0.0.1", port="5432", database="abc")
    #cursor = connection.cursor()
    pool = Pool()
    start_time = time.time()
    for _ in range(1000):
        pool.apply_async(make_query, (connection,))
    pool.close()
    pool.join()
    print(rec)
    print("--- %s seconds ---" % (time.time() - start_time))

这是我得到的回应,

[]
--- 0.48270273208618164 seconds ---

我在这里做错了什么,因为我无法访问任何记录。 但是用户表有数千条记录。

您正在使用multiprocessing 当您生成一个不同的进程时,它不会将数据共享回其父进程,因此当您执行rec.append(row[0]) ,您将该值附加到该特定进程的rec列表中。 然后一旦进程完成评估,它的内存就会被丢弃。

如果您想在进程之间共享状态,有几个可用的原语,但最好的方法是从每个进程返回数据并将其组合到外部函数中。

result_tasks = []
for _ in range(1000):
    result_tasks.append(pool.apply_async(make_query, (connection,)))
result = [res.get() for res in result_tasks]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM