Как обеспечить использование всех процессоров в многопроцессорной среде Python? - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в концепции многопроцессорности.

Мой код

from multiprocessing import Process
def square(x):

    for x in numbers:
        print('%s squared  is  %s' % (x, x**2))

if __name__ == '__main__':
    numbers = [43, 50, 5, 98, 34, 35]

    p = Process(target=square, args=('x',))
    p.start()
    p.join
    print "Done"

результат

Done
43 squared  is  1849
50 squared  is  2500
5 squared  is  25
98 squared  is  9604
34 squared  is  1156
35 squared  is  1225

Я понимаю, мы можем использовать multiprocessing.cpu_count(), чтобы получить номерпроцессора в системе

Тем не менее, мне не удалось добиться 2 заинтересованных вещей.-

  1. Равномерно распределить все задачи по всем процессорам
  2. Проверить, какой процессор был использован каким процессом

1 Ответ

0 голосов
/ 12 февраля 2019

В вашем примере есть несколько вещей.

  • Вы запускаете только один подпроцесс, в задачу которого входит обработка всех чисел.
  • Вам не хватает скобок из p.join(), поэтому процесс никогда не ожидается (именно поэтому Done печатается первым).

Вместо этого следует использовать multiprocessing.Pool, что-то вроде этого.

from multiprocessing import Pool

def square(x):
    print('%s squared is %s' % (x, x**2))


if __name__ == '__main__':
    numbers = range(1, 1000, 50)

    with Pool() as p:
        for value in p.imap_unordered(square, numbers):
            # You could do something with the 
            # return value from `square` here.
            pass  

    print("Done")

Это выводит (например, порядок не гарантируется)

1 squared is 1
51 squared is 2601
101 squared is 10201
151 squared is 22801
201 squared is 40401
251 squared is 63001
401 squared is 160801
451 squared is 203401
501 squared is 251001
301 squared is 90601
551 squared is 303601
601 squared is 361201
351 squared is 123201
651 squared is 423801
701 squared is 491401
751 squared is 564001
801 squared is 641601
851 squared is 724201
901 squared is 811801
951 squared is 904401
Done
  • Pool() по умолчанию использует cpu_count процессы, поэтому вам не нужно беспокоиться об этом.
  • square() теперь обрабатывает только одно число.Он должен действительно вернуть для печати и обработки, а не печатать его сам по себе, но это простой пример.
  • Вы можете использовать .map(), .imap() или некоторые другиеметоды вместо Pool;Я выбрал .imap_unordered(), потому что меня не волнует порядок, в котором я получаю эти значения (и, кроме того, я ничего не делаю с ними в любом случае).

Ничто, в частности, не "привязывает" один процесс к одному ЦП, однако, в конце концов, один процесс может использовать несколько потоков, которые планировщик ОС может планировать на разные ЦП.В разных ОС есть API для ограничения процессоров для каждого процесса (и потока);если вам это действительно нужно, вы можете покопаться в них.

...