[英]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.