Ищет простое решение для python 3.x и windows. Кажется, не поддерживается поддержка textract , что является неудачным, но если вы ищете простое решение для windows / python 3, посмотрите пакет tika , действительно прямой вперед для чтения pdf-файлов
from tika import parser
raw = parser.from_file('sample.pdf')
print(raw['content'])
Можно использовать шаблон потребителя-производителя. Например, можно создать очередь, которая совместно используется потоками. Первый поток, который выбирает данные из сети, ставит в очередь эти данные в общей очереди. Другой поток, который владеет соединением с базой данных, исключает данные из очереди из очереди и передает его базе данных.
Вы не должны использовать потоки вообще для этого. Это - тривиальная задача для , скрутил , и это, вероятно, возьмет Вас значительно далее так или иначе.
Использование только один поток, и имеют завершение триггера запроса событие, чтобы сделать запись.
скрученный будет заботиться о планировании, обратных вызовах, и т.д.... для Вас. Это вручит Вам весь результат как строку, или можно выполнить его через потоковый процессор (я имею программный интерфейс Твиттера и friendfeed API, что оба исчерпывают события вызывающим сторонам, поскольку результаты все еще загружаются).
В зависимости от того, что Вы делаете со своими данными, Вы могли просто вывести полный результат в sqlite, поскольку это завершено, приготовьте его и выведите его или приготовьте его, в то время как это читается, и выведите его в конце.
у меня есть очень простое приложение, которое делает что-то близко к тому, что Вы желаете на GitHub. Я звоню, это pfetch (найдите что-либо подобное выборке). Это захватывает различные страницы в расписании, передает результаты потоком в файл, и дополнительно выполняет сценарий после успешного завершения каждого. Это также делает некоторый необычный материал как условное выражение, ДОБИРАЕТСЯ, но все еще могла быть хорошая основа для того, что Вы делаете.
Переключитесь на многопроцессорная обработка . Это намного лучше, масштабы хорошо, может пойти вне использования нескольких ядер при помощи нескольких центральных процессоров, и интерфейс совпадает с Python использования, распараллеливающим модуль.
Или, как предложенный Ali, просто использование механизм объединения потока SQLALCHEMY . Это обработает все для Вас автоматически и имеет много дополнительных функций, только чтобы заключить некоторым в кавычки из них:
Или если Вы ленивы, как я, можно использовать SQLAlchemy. Это обработает поточную обработку для Вас, ( локальный поток использования, и некоторая организация пула подключений ) и способ, которым это делает это даже настраивающееся .
Для добавленной премии, если/когда Вы понимаете/решаете, что использование Sqlite для любого параллельного приложения будет бедствием, Вы не должны будете изменять свой код для использования MySQL, или Пост-ГРЭС или чего-либо еще. Можно просто переключиться.
Мне нравится ответ Evgeny - Очереди обычно являются лучшим способом реализовать коммуникацию межпотока. Для полноты вот некоторые другие опции:
OperationalError
, но вводные и заключительные соединения как это обычно Нет - Нет, из-за производительности наверху. Необходимо разработать параллелизм для программы. SQLite имеет четкие ограничения, и необходимо повиноваться им, видеть FAQ (также следующий вопрос).
Scrapy походит на потенциальный ответ на мой вопрос. Его домашняя страница описывает мою точную задачу. (Хотя я не уверен, насколько стабильный код все же.)
Я бы взглянул на модуль Python y_serial для сохранения данных: http://yserial.sourceforge.net
, который обрабатывает проблемы взаимоблокировки, связанные с одной базой данных SQLite. Если спрос на параллелизм становится большим, можно легко настроить класс Farm для многих баз данных, чтобы распределить нагрузку в течение стохастического времени.
Надеюсь, это поможет вашему проекту ... он должен быть достаточно простым для реализации за 10 минут.
Следующее найдено на mail.python.org.pipermail.1239789
Я нашел решение. Я не знаю, почему в документации Python нет ни слова об этой опции. Поэтому нам нужно добавить новый аргумент ключевого слова в функцию соединения
, и мы сможем создавать из него курсоры в другом потоке. Так что использование:
sqlite.connect(":memory:", check_same_thread = False)
отлично подходит для меня. Конечно, с этого момента мне нужно заботиться о безопасном многопоточном доступе к базе данных. В любом случае спасибо всем за попытку помочь.
Вопреки распространенному мнению, новые версии sqlite3 действительно поддерживают доступ из нескольких потоков.
Это можно включить с помощью необязательного аргумента ключевого слова check_same_thread
:
sqlite.connect(":memory:", check_same_thread=False)