Programa Python Multiprocessing usando apenas 1 dos 4 núcleos [closed]

0

Estou usando o Ubuntu 17.04 de 64 bits com processador Intel® Core ™ i7-7500U de 2.70GHz × 4 e 16GB de RAM. O monitor do sistema mostra 3 processos python e, ao procurar os recursos, apenas 1 núcleo é utilizado para 100%, os 3 restantes são apenas 2-3%.

Até onde eu sei, processos separados são executados em núcleos separados, certo?

O código que está sendo executado é:

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')
    
por Arjunsingh 23.05.2017 / 20:17

1 resposta

2

Seu multithreading está perfeitamente bem, mas o código que é executado não é o que você espera.

Tente executar este código

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

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

Sim, a função boom1 não é chamada, mas você verá que 1 thread ainda tenta fazer "alguma coisa" e leva uma eternidade. Na verdade, esse "algo" é ConstantExpressionEvaluator - ele tenta pré-computar expressões constantes por motivos de desempenho, mas sua constante é tão grande que leva o tempo todo para ser concluído. Para quebrar essa otimização single-threaded e executar o código em paralelo, basta adicionar este passo extra aos seus cálculos.

Algo parecido com isto

def boom1():
    z = 5 ** 10
    z = z ** 1000000000
    print(z)
    
por Andrey Taptunov 23.05.2017 / 21:35

Tags