Параллельный доступ Python Sqlite

У меня есть сценарий, в котором стороннее приложение сканирует папку и запускает мой скрипт python / сгенерированный EXE несколько раз (да! Количество отдельных процессов) для количества файлов, находящихся в папке. Мой сценарий / приложение записывает путь к файлу в локальную базу данных sqlite, вызывает следующее приложение и завершает работу. Мой сценарий / приложение заботится о том, чтобы вызывать только один экземпляр следующего приложения. Но ничего нельзя сделать со сторонним приложением, которое вызывает мой скрипт.

Проблема Иногда более 1000 экземпляров моего скрипта / приложения могут быть вызваны одновременно, что приводит к почти 1000 одновременных подключений к локальной базе данных sqlite. Из-за ограниченного количества одновременных подключений, возможных с sqlite, некоторые процессы получают исключение «база данных заблокирована». Это приводит к тому, что некоторые имена файлов НЕ записываются в базу данных. Мы придумали для этого обходной путь. Пишем в базу данных в бесконечном цикле. При возникновении исключения мы переводим поток в спящий режим, скажем, на 50 миллисекунд и повторяем попытку до тех пор, пока запись не сработает. Я знаю, что это не чистый подход.

Есть ли лучший способ сделать это? Как мне обрабатывать 1000, может быть 10000 или может быть несколько одновременных подключений, и все же каждый сценарий выполняется успешно?

Почему вы используете sqlite для такого рода приложений?

roganjosh 07.05.2018 20:13

Возможно, вы можете использовать журнал записи вперед (ваша спецификация немного неограниченна) или установить новый тайм-аут, если база данных заблокирована, но кажется (по крайней мере, мне), что это неправильная технология для использования.

roganjosh 07.05.2018 20:15

Если бы я имел использовал sqlite, я бы, вероятно, пошел по пути одного процесса записи, читающего из канала kafka, но я понятия не имею, насколько это будет успешно.

roganjosh 07.05.2018 20:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
960
1

Ответы 1

Ваш обходной путь правильный, но вы можете заставить базу данных делать большую часть работы, установив тайм-аут занятости. (Для 1000 подключений это должно быть установлено чрезвычайно высоким, по существу, бесконечным, как вы уже делаете.)

Но это все равно приводит к времени ожидания случайный. SQLite не ожидает завершения транзакции одного писателя, а затем сигнализирует о следующей, потому что для этого нет портативный API. Однако в Windows вы можете использовать именованный объект мьютекса (который требует некоторого обман для доступа к нему из Python).

Подлинный вопрос; вы очень хорошо разбираетесь в SQLite, вы бы лично пошли по маршруту, прежде чем переключать технологию (если бы SQLite не был принудительным вариантом)?

roganjosh 07.05.2018 21:32

В настоящее время я нахожусь на этапе, когда мне нужно решить, следует ли мне выйти из SQLite с гораздо меньшей нагрузкой, чем эта, и вы представили это как логический курс действий, чтобы преодолеть пару препятствий, но я не уверен, что мне это нравится.

roganjosh 07.05.2018 21:33

@roganjosh Клиент-серверные базы данных, такие как PostgreSQL, пытаются увеличить параллелизм, позволяя нескольким авторам изменять разные части базы данных. Я не знаю, будут ли работать 1000 соединений, добавляемых в одну и ту же таблицу (если база данных может доказать, что они не мешают друг другу, она может работать нормально), но эта проблема больше связана с поиском дешевого механизма для сериализуйте всех писателей.

CL. 07.05.2018 22:27

Другие вопросы по теме