В вашем примере есть несколько вещей.
- Вы запускаете только один подпроцесс, в задачу которого входит обработка всех чисел.
- Вам не хватает скобок из
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 для ограничения процессоров для каждого процесса (и потока);если вам это действительно нужно, вы можете покопаться в них.