Неблокирующий вызов базы данных Python

#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) дайте мне знать, если вам нужна дополнительная помощь.