Я хочу использовать ThreadPoolExecutor для распараллеливания некоторого (устаревшего) кода с доступом к базе данных. Я хотел бы избежать создания нового подключения к базе данных для каждого потока, поэтому я использую threading.local(), чтобы сохранить одно соединение для каждого потока, например:
Код: Выделить всё
thread_local = threading.local()
def get_thread_db():
if not hasattr(thread_local, "db"):
thread_local.db = get_database_connection()
return thread_local.db
def do_stuff():
db_conn = get_thread_db()
# ...
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(do_stuff, *params) for params in data]
# ...
Как обеспечить правильное закрытие соединений всех потоков после завершения всех отправленных задач? Похоже, что ThreadPoolExecutor имеет параметр инициализатора, но не имеет параметра для обработчика выхода.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... olexecutor