Программа Pipon Multiprocessing, использующая только 1 из 4 ядер [закрыта]

Я использую 64-разрядную версию Ubuntu 17.04 с процессором Intel® Core ™ i7-7500U с процессором 2,70 ГГц × 4 и 16 ГБ оперативной памяти. Системный монитор показывает 3 процесса python и при просмотре ресурсов используется только 1 ядро ​​до 100%, остальные 3 - всего 2-3%.

Насколько мне известно, отдельные процессы выполняются на отдельные ядра, [? d1]

Выполняемый код:

import time import multiprocessing def boom1(*args): print(5**10000000000) def boom2(*args): print(5**10000000000) def boom3(*args): print(5**10000000000) def boom4(*args): print(5**10000000000) if __name__=="__main__": array = [] p1 = multiprocessing.Process(target=boom1, args=(array,)) p2 = multiprocessing.Process(target=boom1, args=(array,)) p3 = multiprocessing.Process(target=boom1, args=(array,)) p4 = multiprocessing.Process(target=boom1, args=(array,)) p1.start() p2.start() p3.start() p4.start() p1.join() p2.join() p3.join() p4.join() print('Done')
0
задан 23 May 2017 в 21:17

2 ответа

Ваше многопоточное воспроизведение отлично, но выполняемый код не является тем, что вы ожидаете.

Попробуйте запустить этот код

def boom1(): print(5**10000000000) if __name__=="__main__": print('Done')

Да, функция boom1 не вызывается, но вы увидите, что 1 поток по-прежнему пытается «что-то», и он берет навсегда. Фактически, это «что-то» - это ConstantExpressionEvaluator - он пытается прекомпопировать постоянные выражения по соображениям производительности, но ваша константа настолько велика, что требуется все время для завершения.

Что-то вроде этого

def boom1(): z = 5 ** 10 z = z ** 1000000000 print(z)
2
ответ дан 18 July 2018 в 12:50

Ваше многопоточное воспроизведение отлично, но выполняемый код не является тем, что вы ожидаете.

Попробуйте запустить этот код

def boom1(): print(5**10000000000) if __name__=="__main__": print('Done')

Да, функция boom1 не вызывается, но вы увидите, что 1 поток по-прежнему пытается «что-то», и он берет навсегда. Фактически, это «что-то» - это ConstantExpressionEvaluator - он пытается прекомпопировать постоянные выражения по соображениям производительности, но ваша константа настолько велика, что требуется все время для завершения.

Что-то вроде этого

def boom1(): z = 5 ** 10 z = z ** 1000000000 print(z)
2
ответ дан 24 July 2018 в 20:02
  • 1
    Если я вызову эти функции следующим образом p1=multiprocessing.Process(target=boom1, args=(array,)) p2 = multiprocessing.Process(target=boom2, args=(array,)) p3 = multiprocessing.Process(target=boom3, args=(array,)) p4 = multiprocessing.Process(target=boom4, args=(array,)) Теперь даже до инициализации процессов, ConstantExpressionEvaluator запускается на одном ядре, что является причиной того, что я не могу увидеть остальные 3 ядра, которые используются? Это то, что вы говорили? – Arjunsingh 24 May 2017 в 08:07
  • 2
    @ Арджунсинг точно – Andrey Taptunov 24 May 2017 в 08:44
  • 3
    Я выполнил 2 оператора в 4-х функциях, как вы указали, и запрограммировал 4 разных процесса для каждой функции и назвал их 1- печать (5 увеличена до 100) 2 = печать (5 увеличена до 10000000). Теперь одно ядро ​​запускается, как вы сказали, где выполняется Constant = ExpressionEvaluator, чтобы выполнить команду print (5 увеличено до 100). Но все приведенные 4 печатаются мгновенно. То, что я не понимал, - это если он работает на одном ядре, тогда он должен печатать их последовательно справа и потратить некоторое время на вычисление следующей печати (5 увеличено до 100). – Arjunsingh 24 May 2017 в 20:24
  • 4
    После того, как он распечатает эти 4 результата, я мог бы увидеть 4 выполняемых процесса Python. Предположим, что если он был сохранен в кеше, но я использовал 4 разных команды для всех 4 функций, т. Е. Печать (5 увеличена до 100), печать (4 увеличена до 100), печать (3 поднята до 100), печать (2 поднята до 100), но затем тоже напечатал все эти 4 одновременно. Я предполагаю что-то не так? – Arjunsingh 24 May 2017 в 20:24

Другие вопросы по тегам:

Похожие вопросы: