Páginas

quinta-feira, 30 de maio de 2013

Pegar o número de CPUs (CORES) usando python

Eu estava testando alguns algorítimos para funcionar de forma a usar os vários núcleos das máquinas atuais (Core i7 - 8 núcleos), porem esse número pode varia para mais ou para menos dependendo da máquina. Quando só importa a sua máquina para processar o algorítimo, você acaba colocando o numero de threads simultâneas manualmente... porem quando você quer extrair o máximo da maquina, independente de qual ela seja, você deve encontrar de forma automática o número de cores para determinar o melhor número de threads a ser usada simultaneamente.

Porem no Python isso pode variar um pouco, aqui eu juntei vários casos de como determinar o número de cores (CPUs) em vários ambientes diferentes: (Windows, Linux, FreeBSD, Jython e outros)

Cada uma das funções abaixo serve tem uma forma diferente de determinar o número de CPUs, é só escolher a que mais se adéqua ao seu ambiente.

def get_cores_python():
    u"\nRetorna o número de cpu usnado python 2.6+\n"
    import multiprocessing
    return multiprocessing.cpu_count()

#-----------

def get_cores_posix():
    u"\nRetorna o número de cpu usnado POSIX(Interface Portável entre Sistemas Operacionais)\n"
    import os
    res = int(os.sysconf('SC_NPROCESSORS_ONLN'))
    if res > 0:
       return res
    return None

#-----------

def get_cores_psutil():
    u"""
Retorna o número de cpu usnado google psutil
http://code.google.com/p/psutil/
"""
    import psutil
    return psutil.NUM_CPUS

#-----------

def get_cores_windows():
    u"\nRetorna o número de cores(CPUs) em máquinas Windows\n"
    import os
    res = int(os.environ['NUMBER_OF_PROCESSORS'])
    if res > 0:
        return res
    return None

#-----------

def get_cores_jython():
    u"\nRetorna o númeo cores(CPUs) usando interpretador jython\n"
    from java.lang import Runtime
    runtime = Runtime.getRuntime()
    res = runtime.availableProcessors()
    if res > 0:
        return res
    return None

#-----------

def get_cores_bsd():
    u"\nRetorna o número de cores(CPUs) usando o processo externo em máquinas com sistema BSD (FreeBSD, openBSD e outras)\n"
    import subprocess
    sysctl = subprocess.Popen(['sysctl', '-n', 'hw.ncpu'], stdout=subprocess.PIPE)
    scStdout = sysctl.communicate()[0]
    res = int(scStdout)
    if res > 0:
       return res
    return None

#-----------

def get_cores_linux():
    u"\nRetorna o número de cores(CPUs) atraves da leitura do /proc/cpuinfo contando as chamadas de cada núcleo\n"
    res = open('/proc/cpuinfo').read().count('processor\t:')
    if res > 0:
       return res
    return None

#-----------

def get_cores_solaris():
    u"\nRetorna o número de cores(CPUs) atravez da leitura do /devices/pseudo/ contanto um a um\n"
    pseudoDevices = os.listdir('/devices/pseudo/')
    expr = re.compile('^cpuid@[0-9]+$')
    res = 0
    for pd in pseudoDevices:
        if expr.match(pd) != None:
            res += 1
    if res > 0:
       return res

#-----------

def get_cores_unixlike():
    u"""
Returna o número de cores(CPUs) analisando o arquivo de log dmesg.
Esse processo pode varias muito entre versões do sistema operacial, então esse codigo pode necessitar de ajustes.
O quê importa é a idéia do algorítimo. -- Está validado usando ubuntu 13.04 --
"""
    dmesg = open('/var/log/dmesg').read() # O local varia com a distribuição
    dmesgProcess = subprocess.Popen(['dmesg'], stdout=subprocess.PIPE)
    dmesg = dmesgProcess.communicate()[0]
    res = 0
    while ' CPU' + str(res) + ': ' in dmesg: # faz o loog enquando ' CPU: ' existir no arquivo de log
        res += 1
    if res > 0:
        return res
    return None

Nenhum comentário:

Postar um comentário