При использовании SQLAlchemy в разветвленном процессе рекомендуемый подход в документации по sqlalchemy (EDIT: первоначально связанные документы 1.3) заключается в вызове engine.dispose() сразу после инициализации разветвленного процесса. Это сделано для того, чтобы дочерние процессы не могли использовать соединение с родительским процессом. Если вы используете объект Pool, он будет выглядеть примерно так:
Код: Выделить всё
from multiprocessing import Pool
engine = create_engine("mysql+mysqldb://user:pass@host/dbname")
def run_in_process(some_data_record):
with engine.connect() as conn:
conn.execute(text("..."))
def initializer():
"""ensure the parent proc's database connections are not touched
in the new connection pool"""
engine.dispose(close=False)
with Pool(10, initializer=initializer) as p:
p.map(run_in_process, data)
Однако удаление всего пула соединений кажется мне несколько чрезмерным. На мой взгляд, это приводит к тому, что дочерний процесс говорит родительскому процессу разорвать все свои соединения. Это прекрасно работает в однопользовательском приложении, но я не уверен, как вызов Engine.dispose() будет вести себя в веб-приложении, к которому обращаются многие пользователи.
Предположим, я разветвил процесс A, который в настоящее время выполняет длительную транзакцию с моим движком. Когда я создаю новый процесс B и вызываю Engine.dispose(), приведет ли это к сбоям в процессе A?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... her-proces