Я использую 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')
Ваша многопоточность прекрасно подходит, но код, который выполнен, не то, что Вы ожидаете.
Попытку выполнить этот код
def boom1():
print(5**10000000000)
if __name__=="__main__":
print('Done')
Да, boom1 функция не называют, но Вы будете видеть, что 1 поток все еще пытается сделать "что-то", и это берет навсегда. На самом деле это, "что-то" - ConstantExpressionEvaluator - он пытается предварительно вычислить константные выражения по причинам производительности, но Ваша константа является столь большой, что он берет все время для окончания. Чтобы повредить эту однопоточную оптимизацию и выполнить код параллельно просто добавляют этот дополнительный шаг к Вашим вычислениям.
Что-то вроде этого
def boom1():
z = 5 ** 10
z = z ** 1000000000
print(z)