В моем скрипте Python мне нужно выполнить серию запросов sql к похожим (но не связанным) таблицам в одной базе данных. Выходные столбцы для каждого выбора всегда одинаковы. Есть ли способ выполнить это асинхронно, чтобы сократить время обработки?
tables = pd.DataFrame(['Table1, Table2, Table3'], columns=['Table Name'])
sqlQuery1 = '''select a, b, c from TABLENAME'''
sqlDataLst = []
for i, row in tables.iterrows():
sqlQuery1_exe= sqlQuery1.replace("TABLENAME",row['Table Name'])
sqlData = pd.read_sql_query(sqlQuery1_exe,getConn())
sqlDataLst.append(sqlData)
sqlDataAll = pd.concat(sqlDataLst)
Вы можете использовать многопоточность. Определите новую функцию (назовем ее new_function
), которая получает имя таблицы в качестве аргумента, а затем запускает read_sql_query
.
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=10) as executor:
for i, row in tables.iterrows():
future = executor.submit(new_function, row['Table Name'])
Примечание. Когда вы используете многопоточность в python, вы должны знать о GIL (и разработчики Pandas заботятся об этом).
Добавление к sqlDataLst в цикле for не улучшило скорость. Тем не менее, заполнение списка в цикле for с помощью future[i] = execu...
, а затем повторение этого цикла, чтобы получить данные, сделали свое дело. Спасибо :-)
Хорошо знать. Рад слышать, что это помогло.
Возможно вам нужна такая же логика..