Python sqlite3 и параллелизм

Ищет простое решение для python 3.x и windows. Кажется, не поддерживается поддержка textract , что является неудачным, но если вы ищете простое решение для windows / python 3, посмотрите пакет tika , действительно прямой вперед для чтения pdf-файлов

from tika import parser

raw = parser.from_file('sample.pdf')
print(raw['content'])

78
задан Noah 14 February 2009 в 00:53
поделиться

11 ответов

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

39
ответ дан Erik Allik 6 November 2019 в 03:02
поделиться

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

Использование только один поток, и имеют завершение триггера запроса событие, чтобы сделать запись.

скрученный будет заботиться о планировании, обратных вызовах, и т.д.... для Вас. Это вручит Вам весь результат как строку, или можно выполнить его через потоковый процессор (я имею программный интерфейс Твиттера и friendfeed API, что оба исчерпывают события вызывающим сторонам, поскольку результаты все еще загружаются).

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

у меня есть очень простое приложение, которое делает что-то близко к тому, что Вы желаете на GitHub. Я звоню, это pfetch (найдите что-либо подобное выборке). Это захватывает различные страницы в расписании, передает результаты потоком в файл, и дополнительно выполняет сценарий после успешного завершения каждого. Это также делает некоторый необычный материал как условное выражение, ДОБИРАЕТСЯ, но все еще могла быть хорошая основа для того, что Вы делаете.

13
ответ дан Dustin 6 November 2019 в 03:02
поделиться

Переключитесь на многопроцессорная обработка . Это намного лучше, масштабы хорошо, может пойти вне использования нескольких ядер при помощи нескольких центральных процессоров, и интерфейс совпадает с Python использования, распараллеливающим модуль.

Или, как предложенный Ali, просто использование механизм объединения потока SQLALCHEMY . Это обработает все для Вас автоматически и имеет много дополнительных функций, только чтобы заключить некоторым в кавычки из них:

  1. SQLAlchemy включает диалекты для SQLite, Пост-ГРЭС, MySQL, Oracle, SQL MS, Firebird, MaxDB, Доступа MS, Sybase и Informix; IBM также выпустила драйвер DB2. Таким образом, Вы не должны переписывать свое приложение, если Вы решаете переехать от SQLite.
  2. система Единицы работы, центральная часть Объектного реляционного картопостроителя (ORM) SQLALCHEMY, организует ожидание, создают/вставляют/обновляют/удаляют операции в очереди, и сбрасывает их всех в одном пакете. Для выполнения этого, это выполняет топологический "вид зависимости" всех измененных объектов в очереди, чтобы соблюдать ограничения внешнего ключа и собирает в группу избыточные операторы, где они могут иногда обрабатываться в пакетном режиме еще больше. Это производит maxiumum эффективность и безопасность транзакции, и сводит к минимуму вероятность мертвых блокировок.
12
ответ дан Prof. Falken 6 November 2019 в 03:02
поделиться

Или если Вы ленивы, как я, можно использовать SQLAlchemy. Это обработает поточную обработку для Вас, ( локальный поток использования, и некоторая организация пула подключений ) и способ, которым это делает это даже настраивающееся .

Для добавленной премии, если/когда Вы понимаете/решаете, что использование Sqlite для любого параллельного приложения будет бедствием, Вы не должны будете изменять свой код для использования MySQL, или Пост-ГРЭС или чего-либо еще. Можно просто переключиться.

7
ответ дан Ali Afshar 6 November 2019 в 03:02
поделиться

Мне нравится ответ Evgeny - Очереди обычно являются лучшим способом реализовать коммуникацию межпотока. Для полноты вот некоторые другие опции:

  • Близко соединение с БД, когда порожденные потоки закончили использовать его. Это зафиксировало бы Ваш OperationalError, но вводные и заключительные соединения как это обычно Нет - Нет, из-за производительности наверху.
  • не используют дочерние потоки. Если некогда в секунду задача довольно легка, Вам могло бы сойти с рук выполнение выборки и хранилища, то, спя до правильного момента. Это - нежелательный как выборка, и операции хранилища могли взять> 1 секунда, и Вы теряете преимущество мультиплексированных ресурсов, которые Вы имеете с многопоточным подходом.
0
ответ дан James Brady 6 November 2019 в 03:02
поделиться

Необходимо разработать параллелизм для программы. SQLite имеет четкие ограничения, и необходимо повиноваться им, видеть FAQ (также следующий вопрос).

0
ответ дан iny 6 November 2019 в 03:02
поделиться

Scrapy походит на потенциальный ответ на мой вопрос. Его домашняя страница описывает мою точную задачу. (Хотя я не уверен, насколько стабильный код все же.)

0
ответ дан RexE 6 November 2019 в 03:02
поделиться

Я бы взглянул на модуль Python y_serial для сохранения данных: http://yserial.sourceforge.net

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

Надеюсь, это поможет вашему проекту ... он должен быть достаточно простым для реализации за 10 минут.

0
ответ дан 24 November 2019 в 10:03
поделиться

Следующее найдено на mail.python.org.pipermail.1239789

Я нашел решение. Я не знаю, почему в документации Python нет ни слова об этой опции. Поэтому нам нужно добавить новый аргумент ключевого слова в функцию соединения , и мы сможем создавать из него курсоры в другом потоке. Так что использование:

sqlite.connect(":memory:", check_same_thread = False)

отлично подходит для меня. Конечно, с этого момента мне нужно заботиться о безопасном многопоточном доступе к базе данных. В любом случае спасибо всем за попытку помочь.

16
ответ дан 24 November 2019 в 10:03
поделиться

Вопреки распространенному мнению, новые версии sqlite3 действительно поддерживают доступ из нескольких потоков.

Это можно включить с помощью необязательного аргумента ключевого слова check_same_thread :

sqlite.connect(":memory:", check_same_thread=False)
170
ответ дан 24 November 2019 в 10:03
поделиться

Используйте threading.Lock ()

0
ответ дан 24 November 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: