Многопроцессорность Python: работа с 2000 процессами - PullRequest
0 голосов
/ 14 марта 2019

Ниже приведен мой мульти-код обработки.RegressTuple насчитывает около 2000 элементов.Итак, следующий код создает около 2000 параллельных процессов.Мой ноутбук Dell xps 15 дает сбой при запуске.

  1. Не может ли многопроцессорная библиотека Python обрабатывать очередь в соответствии с доступностью оборудования и запускать программу без сбоев за минимальное время?Я не делаю это правильно?
  2. Есть ли вызов API в python для получения возможного количества аппаратных процессов?
  3. Как я могу реорганизовать код, чтобы использовать входную переменную, чтобы получить счетчик параллельных потоков (жестко запрограммированный) и несколько раз пройти по многопоточности до завершения - Таким образом, после нескольких экспериментов,Я смогу получить оптимальное количество потоков.
  4. Каков наилучший способ запустить этот код за минимальное время без сбоев.(Я не могу использовать многопоточность в моей реализации)

Настоящим мой код:

regressTuple = [(x,) for x in regressList]
processes = []

for i in range(len(regressList)):                  
    processes.append(Process(target=runRegressWriteStatus,args=regressTuple[i]))

for process in processes: 
    process.start() 

for process in processes:
    process.join()

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Есть несколько вещей, о которых нам нужно помнить

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

  2. Количество ядер определяет, сколько из этих запущенных процессов может одновременно выполняться параллельно.

  3. Сбой вашей системы может быть из-за того, что ваша целевая функция, на которой работают эти процессы, выполняет что-то тяжелое и ресурсоемкое, с чем система не может справиться, если одновременно запущено несколько процессов, или ограничение nprocs на система исчерпала себя, и теперь ядро ​​не может вращать новые системные процессы.

При этом не рекомендуется создавать до 2000 процессов, даже если у вас есть 16-ядерный компьютер Intel Skylake, потому что создание нового процесса в системе не является легкой задачей, потому что есть количество вещей, таких как генерация pid, выделение памяти, генерация адресного пространства, планирование процесса, переключение контекста и управление всем его жизненным циклом, которые происходят в фоновом режиме. Так что ядру сложно выполнить новый процесс,

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

def target_func(data):
    # process the input data

with multiprocessing.pool(processes=multiprocessing.cpu_count()) as po:
    res = po.map(f, regressionTuple)
1 голос
/ 14 марта 2019
  1. Не удается многопроцессорной библиотеке Python обрабатывать очередь в зависимости от доступности оборудования и запускать программу без сбоев минимальное время? Я не делаю это правильно?

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

  1. Есть ли в Python вызов API для получения возможного количества аппаратных процессов?

Если бы они были, знал бы он заранее, сколько памяти понадобится вашей задаче?

  1. Как я могу реорганизовать код для использования входной переменной, чтобы получить счетчик параллельных потоков (жестко запрограммированный) и несколько циклов раз до завершения - Таким образом, после нескольких экспериментов, я буду возможность получить оптимальное количество потоков.

Как отметил Балдерман, пул - хороший способ для этого.

  1. Каков наилучший способ запустить этот код за минимальное время без сбоев. (Я не могу использовать многопоточность в моей реализации)

Используйте пул или используйте доступную системную память, разделите на ~ 3 МБ и посмотрите, сколько задач вы можете запустить одновременно.

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

...