Задача
Я пишу программу, которая читает набор документов из корпуса (каждая строка является документом). Каждый документ обрабатывается с использованием функции processdocument
, ему присваивается уникальный идентификатор, а затем записывается в базу данных. В идеале мы хотим сделать это, используя несколько процессов. Логика следующая:
- Основная процедура создает новую базу данных и настраивает несколько таблиц.
- Основная подпрограмма устанавливает группу процессов / потоков, которые будут запускать рабочую функцию.
- Основная процедура запускает все процессы.
- Основная процедура читает корпус, добавляя документы в очередь.
- Рабочая функция каждого процесса зацикливается, считывая документ из очереди, извлекая из него информацию, используя
processdocument
, и записывая информацию в новую запись в таблице в базе данных.
- Рабочий цикл прерывается, когда очередь пуста, и основной подпрограммой установлен соответствующий флаг (если больше нет документов для добавления в очередь).
Вопрос
Я относительно новичок в sqlalchemy (и базах данных в целом). Я думаю, что код, используемый для настройки базы данных в основной программе, работает нормально, насколько я могу судить. Я застрял в том, что точно не знаю, что поместить в рабочие функции для каждого процесса для записи в базу данных, не конфликтуя с остальными.
Ничего особенно сложного не происходит: каждый процесс получает уникальное значение, которое присваивается записи из объекта multiprocessing.Value, защищенного замком. Я просто не уверен, следует ли передать то, что я должен передать рабочей функции (кроме очереди), если что-нибудь. Я передаю экземпляр sqlalchemy.Engine, который я создал в основной процедуре? Экземпляр метаданных? Создаю ли я новый движок для каждого процесса? Есть ли какой-то другой канонический способ сделать это? Что-то особенное, что мне нужно иметь в виду?
Дополнительные комментарии
Я хорошо знаю, что мог бы не беспокоиться о многопроцессорности, но сделать это в одном процессе, но позже мне придется написать код, который будет читать несколько процессов для базы данных, поэтому я мог бы также выяснить как это сделать сейчас.
Заранее спасибо за помощь!