2016-10-08 6 views
0

Я пробовал python3multiprocessing на машине, которая имеет 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 не в состоянии использовать ядра, или я ничего не понимаю о ядрах или это что-то еще?

+0

«многопроцессорность» создает процессы. После этого до ОС можно распределять эти процессы между процессорами (и ядрами ЦП). – zvone

+0

Очень странно. Даже если некоторые ядра заняты другими вещами, поскольку ядро ​​отключается после завершения одного процесса, оно должно захватить еще одну работу. Вы можете получить дополнительную информацию, запустив асинхронный процесс и время печати по мере завершения элементов: 'start = time.time(), для элемента в p.imap_unordered (f, [x для x в диапазоне (32)]): print (time.time() - старт) '. – tdelaney

+0

... или, может быть, вы забыли изменить один из параметров на этом тесте! У меня есть два ядра на моем ноутбуке (не смейтесь), поэтому я не могу много тестировать. – tdelaney

ответ

0

Упрощенный и короткий. Cpu-s и ядра - это аппаратные средства, которые имеют ваш компьютер. На этом оборудовании есть операционная система, посредник между оборудованием и программами, запущенными на компьютере. В программах, запущенных на компьютере, выделено время процессора. Одна из этих программ - это интерпретатор python, который запускает все программы, которые имеют конец .py. Итак, время процессора на вашем компьютере, время выделяется на python3. *, Которые, в свою очередь, выделяют время на запущенную вами программу. Эта скорость будет зависеть от того, какое оборудование у вас есть, какую операцию вы выполняете и как cpu-time выделяется между всеми этими экземплярами.

Как отводится процессор? Он похож на цикл while, ОС распределяет инкремент между программами, а интерпретатор python увеличивает время распространения на программы, запущенные интерпретатором python. Именно по этой причине весь компьютер останавливается, когда программа неверно работает.

Многие процессы не равны Больше доступа к оборудованию. Он делает равным больше выделенного времени процессора от времени, отведенного на интерпретатор python. Поскольку вы увеличиваете количество программ под интерпретатором python, которые работают для вашего приложения.

Многие процессы равны больше рабочих лошадей.


Вы видите это на практике в своем коде. Вы увеличиваете количество рабочих лошадок до такой степени, когда интерпретаторы python выделяют cpu-time, разделяются между таким количеством процессов, что все они замедляются.

+0

Есть ли способ дать равное время процессора всем процессам, когда все процессы выполняют одну и ту же работу? – MYGz

Смежные вопросы