Я пробовал python3
multiprocessing
на машине, которая имеет 8 процессоров и каждый процессор имеет четыре ядра (информация от /proc/cpuinfo
). Я написал небольшой скрипт с бесполезной функцией, и я использую time
, чтобы узнать, сколько времени потребуется для его завершения.python multiprocessing, cpu-s и cpu core
from multiprocessing import Pool,cpu_count
def f(x):
for i in range(100000000):
x*x
return x*x
with Pool(8) as p:
a = p.map(f,[x for x in range(8)])
#~ f(5)
Вызов f()
без многопроцессорной занимает около 7s (time
«s "реальный" выход). Вызов f()
8 раз с пулом 8, как видно выше, снова занимает около 7 секунд. Если я назову его 8 раз с пулом из 4, я получаю около 13,5 с, поэтому есть некоторые накладные расходы при запуске скрипта, но он работает в два раза больше. Все идет нормально. Теперь вот часть, которую я не понимаю. Если есть 8 процессоров каждый с 4 ядрами, если я назову его 32 раза с пулом 32, насколько я вижу, он должен снова работать примерно 7 секунд, но он занимает 32 секунды, который на самом деле немного длиннее, чем работает f()
32 раз на пуле 8.
Так что мой вопрос multiprocessing
не в состоянии использовать ядра, или я ничего не понимаю о ядрах или это что-то еще?
«многопроцессорность» создает процессы. После этого до ОС можно распределять эти процессы между процессорами (и ядрами ЦП). – zvone
Очень странно. Даже если некоторые ядра заняты другими вещами, поскольку ядро отключается после завершения одного процесса, оно должно захватить еще одну работу. Вы можете получить дополнительную информацию, запустив асинхронный процесс и время печати по мере завершения элементов: 'start = time.time(), для элемента в p.imap_unordered (f, [x для x в диапазоне (32)]): print (time.time() - старт) '. – tdelaney
... или, может быть, вы забыли изменить один из параметров на этом тесте! У меня есть два ядра на моем ноутбуке (не смейтесь), поэтому я не могу много тестировать. – tdelaney