2015-07-28 2 views
0

При использовании модуля multiprocessing в Python существует ли способ предотвратить процесс переключения на другой процесс в течение определенного времени?Многопроцессорность Python предотвращает отключение к другим процессам

У меня есть ~ 50 различных дочерних процессов, созданных для извлечения данных из базы данных (каждый процесс = каждая таблица в БД), и после запроса и фильтрации данных я пытаюсь записать вывод в файл excel.

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

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

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

Мне было интересно, есть ли способ заблокировать процесс, который для определенной части кода , не происходит переключение контекста между процессами

Или любые другие предложения по ускорению этого процесса?

ответ

1

Не используйте блокировку и не пишите из нескольких процессов; Пусть дочерние процессы возвращают выходные данные родительскому элементу (например, через стандартный вывод) и ожидают, что процессы обработают join, чтобы прочитать его. Я не 100% на API multiprocessing, но вы можете просто отключить родительский процесс и дождаться SIGCHLD и только затем прочитать данные с выхода стандартного выхода и записать его в выходной файл.

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

+0

В качестве альтернативы вы можете связать дочерние процессы с очередью, из которой родительский читает. Таким образом, вам не нужно выводить на выходе. Интересно, какой путь был бы наиболее эффективным. – NBartley

+0

Хм ... единственное, что я не уверен в этом подходе, - это то, что результат, который создает дочерний процесс, довольно большой, поэтому q.get() нужно вызвать до того, как все данные будут извлечены из дочернего процесса, в котором если дочерний процесс будет продолжать работать, пока все данные не будут переданы в очередь. По крайней мере, это мое понимание. Это не? – markk

+0

Я полагаю, что это зависит от реализации очереди; почему вы предполагаете, что он имеет ограничение по размеру? Использование очереди имеет то преимущество, что дочерний процесс может выйти до того, как родитель прочитает все данные, в отличие от использования стандартного вывода. – shevron

0

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

Смежные вопросы