Python 3 Multiprocessing - Сколько процессов мне следует использовать? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть простая программа для запуска 8 процессов. Она значительно сокращает время выполнения сценария с помощью многопроцессорной обработки, однако я не уверен, сколько процессов я должен поставить для максимальной загрузки своего ЦП. В настоящее время мой процессор состоит из 6 ядер с одним физическим процессором, поскольку это VPS. :

def spider1():
def spider2():
def spider3():
def spider4():
def spider5():
def spider6():
def spider7():
def spider8():
if __name__ == '__main__':
    p1 = multiprocessing.Process(target=spider1,)
    p2 = multiprocessing.Process(target=spider2,)
    p3 = multiprocessing.Process(target=spider3,)
    p4 = multiprocessing.Process(target=spider4, )
    p5 = multiprocessing.Process(target=spider5, )
    p6 = multiprocessing.Process(target=spider6, )
    p7 = multiprocessing.Process(target=spider7, )
    p8 = multiprocessing.Process(target=spider8, )
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    p6.start()
    p7.start()
    p8.start()

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Для рекомендации вы должны предоставить гораздо больше информации о вашем случае использования. Многопроцессорная обработка и связанные с ней примитивы связи, такие как очереди, вносят накладные расходы. Кроме того, рассуждение о такой проблеме с использованием VPS вводит много переменных, которые могут сильно исказить экспериментальные результаты.

  1. Узнайте о параллелизме и параллелизме, если вы этого еще не сделали.
  2. Обычно: IO - медленная операция, и переменная доминирует в этом решении.
  3. Я бы использовал это действительно эмпирическое правило с низким разрешением: перейдите с количеством ядер N и умножьте на коэффициент, начинающийся с 1.0, который увеличивается с независимой нагрузкой ввода-вывода и асимптотически уменьшается до 1/N с зависимой нагрузкой ввода-вывода ваших задач.

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

0 голосов
/ 13 сентября 2018

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

psutil.cpu_count()

Но использование загрузки ЦП для вычисления количества порожденных процессов может быть лучшим подходом. Чтобы проверить загрузку ЦП, можно сделать что-то вроде

import psutil
psutil.cpu_times_percent(interval=1, percpu=False)

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

Я думаю, что этот ответ может быть полезным, Ограничение общего использования ЦП в многопроцессорной среде Python

...