Python, SQLite и потоки

Я работаю над приложением, которое будет собирать данные через HTTP из нескольких мест, кэшировать данные локально, а затем обслуживать его через HTTP.

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

Затем в основной поток запустите приложение CherryPy, которое будет запрашивать эту базу данных SQLite и обслуживать данные.

Моя проблема: как мне обрабатывать соединения с базой данных SQLite из моих потоков и из приложения CherryPy?

Если я сделаю подключение к потоку в базу данных, я также смогу создать / использовать базу данных в памяти?

  • Как я могу получить dict из запроса sqlite?
  • Отсутствует таблица при запуске Django Unittest с Sqlite3
  • сведения о столбцах в sqlite3
  • Как добавить несколько «NOT LIKE»%?% »В предложение WHERE в sqlite3 в коде python?
  • Сохранение и преобразование даты SQLite
  • ImportError: нет модуля с именем pysqlite2
  • Исключение символов в Python и sqlite
  • Python, Sqlite3 - Как преобразовать список в ячейку BLOB
  • 5 Solutions collect form web for “Python, SQLite и потоки”

    Краткий ответ: не используйте Sqlite3 в поточном приложении.

    Базы данных Sqlite3 хорошо масштабируются для размера, но довольно ужасно для параллелизма. Вы будете страдать ошибками «База данных заблокирована».

    Если вы это сделаете, вам понадобится подключение к потоку, и вы должны убедиться, что эти соединения очистятся после себя. Это традиционно обрабатывается с помощью потоковых локальных сеансов и выполняется довольно хорошо (например) с использованием ScopedSession SQLAlchemy. Я бы использовал это, если бы был вами, даже если вы не используете функции ORM SQLAlchemy.

    Вы можете использовать что-то подобное.

    «… создайте несколько потоков, которые будут собирать данные с заданным интервалом и кэшировать эти данные локально в базу данных sqlite. Затем в основном потоке запускается приложение CherryPy, которое будет запрашивать этот sqlite db и обслуживать данные».

    Не тратьте много времени на нитки. То, что вы описываете, – это просто процессы ОС. Просто запустите обычные процессы, чтобы собрать и запустить Cherry Py.

    Для этого у вас нет реального использования для одновременных потоков в одном процессе. Сборка данных с заданным интервалом – когда выполняется с помощью простых процессов ОС – может быть запланирована ОС очень просто. Крон, например, отлично справляется с этим.

    Приложение CherryPy также является процессом ОС, а не одним потоком какого-то более крупного процесса.

    Просто используйте процессы – нити не помогут.

    В зависимости от приложения БД может стать реальной накладной. Если мы говорим об изменчивых данных, возможно, вы можете полностью пропустить связь через БД и поделиться данными между процессом сбора данных и процессами передачи данных через IPC. Это не вариант, если данные должны быть сохранены, конечно.

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

    Python - лучший язык программирования в мире.