Программа многопроцессорной обработки Python, использующая только 1 из 4 ядер [закрыто]

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

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

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

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 в 11:17

1 ответ

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

Попытку выполнить этот код

def boom1():
    print(5**10000000000)

if __name__=="__main__":
    print('Done')

Да, boom1 функция не называют, но Вы будете видеть, что 1 поток все еще пытается сделать "что-то", и это берет навсегда. На самом деле это, "что-то" - ConstantExpressionEvaluator - он пытается предварительно вычислить константные выражения по причинам производительности, но Ваша константа является столь большой, что он берет все время для окончания. Чтобы повредить эту однопоточную оптимизацию и выполнить код параллельно просто добавляют этот дополнительный шаг к Вашим вычислениям.

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

def boom1():
    z = 5 ** 10
    z = z ** 1000000000
    print(z)
2
ответ дан 3 November 2019 в 04:54

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

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