Многопроцессорная обработка Python с использованием pool.map со списком - PullRequest
1 голос
/ 30 мая 2019

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

import multiprocessing
import os

def square(n):
    #logger.info("Worker process id for {0}: {1}".format(n, os.getpid()))
    logger.info("Evaluating square of the number {0}".format(n))
    print('process id of {0}: {1}'.format(n,os.getpid()))
    return (n * n)

if __name__ == "__main__":
    # input list
    mylist = [1, 2, 3, 4, 5,6,7,8,9,10]

    # creating a pool object
    p = multiprocessing.Pool(4)

    # map list to target function
    result = p.map(square, mylist)

    print(result)

Количество ядер ЦП на моем сервере равно 4. Если я использую 4, запускается только один процесс.В общем, он должен запустить 4 отдельных процесса, верно?

Если я установлю значение 8 в объекте пула ниже, это ответ, который я получил

process id of 1: 25872

process id of 2: 8132

process id of 3: 1672

process id of 4: 27000

process id of 6: 25872

process id of 5: 20964

process id of 9: 25872

process id of 8: 1672

process id of 7: 8132

process id of 10: 27000

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Это запустило 5 отдельных процессов (25872,8132,1672,27000,20964), хотя имеется только 4 ядра ЦП.

  1. Я не понимаю, почему пул инициировал только 1 процесс, когда значение равно 4 и инициировано5 отдельных процессов, когда значение равно 8.

  2. Можно ли создать экземпляр объекта пула со значением, превышающим количество ядер ЦП?

  3. ТакжеКакое оптимальное значение мы должны использовать при создании объекта пула, если список содержит миллион записей?

Я прошел официальную документацию по Python, но не смог найти информацию.Пожалуйста, помогите

1 Ответ

0 голосов
/ 30 мая 2019

Давайте ответим один за другим.

  1. Я не понимаю, почему пул инициировал только 1 процесс, когда значение равно 4, и инициировал 5 отдельных процессов, когда значение равно 8.

Пул инициировал 4 процесса. Не путайте количество ядер у вас с количеством процессов, полностью независимых. У вас есть 5 процессов, потому что начальный Python один также имеет значение. Итак, вы начали с основных процессов python, которые вызывают пул для запуска еще 4 процессов, что составляет 5 из них. Если вы видите, что используются только несколько процессов, это означает, что, вероятно, они способны убить задачу достаточно быстро, поэтому другие процессы не нужны.

  1. Можно ли создать экземпляр объекта пула со значением, превышающим количество ядер ЦП?

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

  1. Кроме того, какое оптимальное значение мы должны использовать при создании объекта пула, если список содержит миллион записей?

Обычно «оптимальным» будет то, что все ядра вашего процессора полностью используются вашим пулом. Таким образом, если у вас есть 4 ядра , 4 процесса будет лучшим вариантом, хотя иногда это не совсем то, что является хорошим начальным приближением.

Последнее замечание,

Я прошел официальную документацию по Python, но не смог найти Информация.

Это не совсем специфично для Python, это общее поведение в CS.

...