AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79574824
Accepted
jaeheon lee
jaeheon lee
Asked: 2025-04-15 17:42:31 +0800 CST2025-04-15 17:42:31 +0800 CST 2025-04-15 17:42:31 +0800 CST

O pool de multiprocessamento força o uso de todos os núcleos?

  • 772

O problema que tive foi que Poolusei todos os processos, mesmo tendo passado um inteiro no processesargumento, Poolque era muito menor que o número total de núcleos que o servidor tinha.

Eu uso pools de multiprocessamento para executar tarefas de longa duração. Por exemplo, executo o seguinte código simples.

n_cores = 20
with Pool(n_cores) as pool:
    results = pool.map(example_function, args)

Isso é muito mais do que o número de núcleos que configurei, mas limitei o número de núcleos a 20 para usar quantos eu precisasse. Executei o código esperando que funcionasse bem, e ele concluiu a tarefa muito mais rápido do que usando um único núcleo. Recentemente, verifiquei o uso de núcleos por meio do htopcomando no Ubuntu e me deparei com uma realidade chocante. Todos os núcleos estão sendo usados ​​enquanto a tarefa está em execução no pool, o que não era o que eu pretendia (usar 100% para todos os processos).

Gostaria de saber se existe uma solução alternativa para esse problema. Se não houver, precisamos considerar outros métodos, como o MPI.

Se estiver faltando alguma coisa, por favor me avise.

Obrigado.

python
  • 2 2 respostas
  • 70 Views

2 respostas

  • Voted
  1. Best Answer
    Booboo
    2025-04-15T19:05:39+08:002025-04-15T19:05:39+08:00

    Resposta curta: Não, em geral, um pool de multiprocessamento não força o uso de todos os núcleos.

    Mas vamos esclarecer algumas coisas:

    O primeiro argumento para o Poolinicializador, processes , é o número de processos a serem criados dentro do pool, que é totalmente diferente do número de núcleos a serem usados. Se você não especificar este argumento ou usar um valor de None, o número de processos que serão criados será o número de CPUs (núcleos) que você forneceu por , multiprocessing.cpu_count()e isso é diferente do número de CPUs utilizáveis, que é fornecido por os.process_cpu_count(). Portanto, especificar n_cores = 20e passar n_corespara o inicializador do pool pode confundir alguém que não esteja familiarizado com o funcionamento do multiprocessamento. Esta variável faria mais sentido se fosse nomeada n_processes.

    Então, quantos núcleos (CPUs) serão realmente utilizados? Supondo que você tenha N núcleos disponíveis, onde N < 20 (o tamanho do pool), temos vários casos:

    1. Se a sua função de trabalho example_function for de longa duração e contiver atividade significativa de E/S ou de rede, de modo que o seu processo periodicamente cede o núcleo em que está sendo executado, permitindo que outros processos o utilizem até que a E/S seja concluída, é possível que todos os núcleos sejam usados ​​— mas não necessariamente simultaneamente. Essa é uma situação em que pode ser útil criar um tamanho de pool maior que o número de núcleos, permitindo que mais atividades de E/S sejam sobrepostas.
    2. example_functioné de longa duração e 100% dependente da CPU (ou seja, sem E/S, atividade de rede, etc.). Nesse caso, eu esperaria que todos os núcleos fossem eventualmente usados ​​pela sua função de trabalho se você estivesse enviando pelo menos N tarefas, mas isso não é garantido, dependendo de quais outros processos estão competindo por recursos da CPU. De qualquer forma, não faz sentido criar um tamanho de pool maior que N; você não pode ter mais de N computações limitadas à CPU em execução paralela quando você tem apenas N CPUs.
    3. example_functiontem execução extremamente curta e consome 100% da CPU (por exemplo, a função retorna apenas o argumento original passado a ela). Supondo que a duração de args(o número de tarefas sendo submetidas) seja relativamente pequena, é possível que, após a criação do primeiro processo do pool, ele consiga processar todas as tarefas submetidas antes que os demais processos do pool sejam criados. Nesse caso extremo, apenas uma CPU seria usada pela sua mapchamada.
    4. Você tem uma única tarefa de longa duração sendo enviada ao pool. Independentemente de especificar um tamanho de pool de 1 ou 20, você usará apenas um único processo. Mas esse processo pode, em algum momento, ser executado em cada um dos núcleos (obviamente, não simultaneamente). Você se importa? Não!

    Dito isso, você afirma:

    Gostaria de saber se existe uma solução alternativa para esse problema. Se não houver, precisamos considerar outros métodos, como o MPI.

    Se estiver faltando alguma coisa, por favor me avise.

    Qual é o seu problema? Você nunca deixa isso claro e, sim, acho que está faltando alguma coisa, e espero que a explicação acima esclareça.

    Resumindo:

    Se você tiver muitas tarefas de longa duração que combinam CPU e E/S, pode ser vantajoso criar um pool maior que o número de núcleos disponíveis, caso busque desempenho máximo . No entanto, não se preocupe com quais núcleos estão sendo usados ​​para executar essas tarefas. Quando sua função de trabalho precisa da CPU para executar uma tarefa, o sistema operacional escolherá uma CPU para você, que pode ou não ser uma CPU previamente atribuída a qualquer uma de suas tarefas.

    Se, no entanto, você quiser limitar os recursos que utiliza, faça isso criando um pool com menos processos. Por exemplo, você está enviando 100 tarefas, mas nunca quer que 4 tarefas sejam executadas em paralelo. Nesse caso, crie um pool com 4 processos. Mas, novamente, você não deve se importar com quais CPUs são atribuídas a esses 4 processos ao longo de sua vida útil, partindo do princípio de que uma CPU é tão boa quanto a outra.

    • 1
  2. EggCox
    2025-04-15T18:29:59+08:002025-04-15T18:29:59+08:00

    Não se preocupe com o uso de 100% da CPU, pois seu sistema operacional gerencia todos os recursos. Fisicamente, ele não consegue usar 100%, provavelmente cerca de 99,(9)%. Se você realmente gosta da velocidade de execução do seu código, pode deixá-lo assim e não planeja executar nenhum outro programa em segundo plano. Caso contrário, recomendo reduzir pela metade.

    • -1

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve