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






Ваш обходной путь правильный, но вы можете заставить базу данных делать большую часть работы, установив тайм-аут занятости. (Для 1000 подключений это должно быть установлено чрезвычайно высоким, по существу, бесконечным, как вы уже делаете.)
Но это все равно приводит к времени ожидания случайный. SQLite не ожидает завершения транзакции одного писателя, а затем сигнализирует о следующей, потому что для этого нет портативный API. Однако в Windows вы можете использовать именованный объект мьютекса (который требует некоторого обман для доступа к нему из Python).
Подлинный вопрос; вы очень хорошо разбираетесь в SQLite, вы бы лично пошли по маршруту, прежде чем переключать технологию (если бы SQLite не был принудительным вариантом)?
В настоящее время я нахожусь на этапе, когда мне нужно решить, следует ли мне выйти из SQLite с гораздо меньшей нагрузкой, чем эта, и вы представили это как логический курс действий, чтобы преодолеть пару препятствий, но я не уверен, что мне это нравится.
@roganjosh Клиент-серверные базы данных, такие как PostgreSQL, пытаются увеличить параллелизм, позволяя нескольким авторам изменять разные части базы данных. Я не знаю, будут ли работать 1000 соединений, добавляемых в одну и ту же таблицу (если база данных может доказать, что они не мешают друг другу, она может работать нормально), но эта проблема больше связана с поиском дешевого механизма для сериализуйте всех писателей.
Почему вы используете sqlite для такого рода приложений?