#python #multithreading #concurrency
#python #многопоточность #параллелизм
Вопрос:
Мне нужно выполнить много одновременных вызовов базы данных, позволяя программе продолжать работать. Когда вызов возвращается, он устанавливает значение.
Если запросы были известны сразу, мы можем использовать ThreadPoolExecutor
, например. Что, если у нас не все запросы готовы заранее, но мы выполняем их по ходу работы? Например, мы просматриваем связанный список, и на каждом узле мы хотим выполнить запрос к базе данных и установить значение на основе ответа.
Задача здесь состоит в том, чтобы не ждать, пока будет возвращен результат базы данных, прежде чем переходить к следующему узлу.
Возможно ли это? Одна из идей состояла бы в том, чтобы создать Thread
объект. Может быть, мы сможем использовать asyncio
это в наших интересах. Преимущество обхода и запроса по мере прохождения, сбора всех узлов и одновременного запуска их всех заключается в том, что база данных не будет перегружена так сильно, однако разница может быть минимальной.
Спасибо!
Ответ №1:
Если вы используете SQLite, вы можете использовать https://pypi.org/project/sqlite3worker /
Если нет, вы можете использовать библиотеку очередей. Вы можете ставить в очередь элементы из ваших вызовов потоков.
И условие для последовательного выполнения элемента очереди.
Вы можете проверить реализацию sqlite3worker и реализовать аналогично для своей собственной базы данных.
PS: Базы данных, такие как SQL Server, позволяют выполнять последующие вызовы по умолчанию, вам не нужно беспокоиться о потокобезопасности.
Комментарии:
1. Запросы к базе данных не нужно запускать последовательно. Очередь может иметь смысл ставить в очередь для добавления запросов, которые будут выполняться при просмотре связанного списка, однако мы не уверены, как получить и установить правильное возвращаемое значение
2. Известные базы данных по умолчанию разрешают вам несколько подключений, что позволит вам запрашивать столько запросов, сколько вы хотите. Проблема связана с базами данных, такими как SQLite, или базами данных на основе FS, такими как dbfs, hdfs. В вашем сценарии вы хотели, чтобы связанный список обновлялся. Это может легко произойти. Вы можете использовать threadpoolexecutor, часть класса Concurrent.futures . Например,
import concurrent.futures with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: results = executor.map(function_name, list_name)
дайте мне знать, если вам нужна дополнительная помощь.