Programação  
 
Rede de conhecimento computador >> Programação >> Programação Python >> Content
Como o processamento paralelo do Python pode ser implementado dentro de um loop for?
O Python oferece várias maneiras de paralelizar para loops, cada um com seus próprios pontos fortes e fracos. A melhor escolha depende da natureza do trabalho dentro do loop e do hardware disponível.

1. `multiprocessing`: Geralmente, essa é a melhor opção para tarefas ligadas à CPU (tarefas que gastam a maior parte do tempo fazendo cálculos). Ele cria vários processos, cada um com seu próprio intérprete, permitindo o paralelismo verdadeiro e ignorando o bloqueio global do intérprete (GIL) que limita a rosqueamento no CPython.

`` `Python
importar multiprocessamento

DEF Process_item (item):
"" "A função a ser executada em paralelo." ""
# Seu código para processar um único item vai aqui.
Result =Item * 2 # Exemplo:Doble o item
resultado de retorno

Se __name__ =='__main__':# importante para a compatibilidade do Windows
itens =intervalo (10)
com multiprocessing.pool (processos =multiprocessing.cpu_count ()) como pool:
Resultados =pool.map (process_item, itens)
Imprimir (resultados)
`` `

* `multiprocessing.pool` cria um conjunto de processos de trabalhador.
* `pool.map` aplica` process_item` a cada item em `itens` simultaneamente. Ele retorna uma lista dos resultados na mesma ordem que a entrada.
* `multiprocessing.cpu_count ()` determina o número de núcleos da CPU, permitindo o paralelismo ideal. Você pode especificar um número menor de processos, se necessário.


2. `concorrente.futures`: Isso fornece uma interface de nível superior para threads e processos, oferecendo mais flexibilidade. Para tarefas ligadas à CPU, você deseja usar o `ProcessPoolExecutor`.

`` `Python
importação concorrente.futures

DEF Process_item (item):
"" "A função a ser executada em paralelo." ""
# Seu código para processar um único item vai aqui.
Result =Item * 2 # Exemplo:Doble o item
Retornar o item, resultado #Returnar a entrada e a saída para rastrear

se __name__ =='__main__':
itens =intervalo (10)
com concurrent.futures.processpoolExecutor () como executor:
Resultados =Executor.map (process_item, itens) #Order preservado

Para o item, resulte em resultados:
print (f "entrada:{item}, saída:{resultado}")
`` `

`Concurrent.futures` oferece mais controle, especialmente com` executor.submit` para tarefas individuais e lidando com exceções.


3. `Threading` (geralmente não recomendado para tarefas ligadas à CPU): O encadeamento é adequado para tarefas ligadas a E/S (tarefas que gastam a maior parte do tempo aguardando recursos externos, como solicitações de rede ou operações de disco). Por causa do GIL, os threads no Cpython não fornecem paralelismo verdadeiro para tarefas ligadas à CPU.

`` `Python
importar rosqueamento

DEF Process_item (item, resultados):
#Seu código para processar um único item vai aqui.
resultado =item * 2 #Example:dupla o item
Results.Append (resultado)

se __name__ =='__main__':
itens =intervalo (10)
Resultados =[]
threads =[]
Para itens em itens:
Thread =Threading.Thread (Target =process_item, args =(item, resultados))
threads.append (thread)
Thread.start ()
Para threads em threads:
Thread.Join ()
Imprimir (resultados)
`` `

Este exemplo usa uma lista compartilhada (`resultados`) que precisa de uma consideração cuidadosa para a segurança do thread (usando bloqueios, se necessário). É mais complexo que o `multiprocessing` ou` concorrente.


Escolhendo o método certo:

* ligado à CPU: Use `multiprocessing` ou` concorrente.futures` com `ProcessPoolExecutor`. `Multiprocessing` é geralmente mais simples para operações diretas de estilo de redes de mapa.
* i/o-ligado: Use `shreading` ou` concorrente.futures` com 'threadpoolexecutor`. `Concurrent.futures` oferece melhor manuseio e controle de exceções.
* misto: Uma abordagem híbrida pode ser necessária, combinando processos para peças e threads intensivos em CPU para peças ligadas a E/S.


Lembre -se de lidar com possíveis exceções nas funções do seu trabalhador e considere a sobrecarga de criar e gerenciar processos ou threads. Para tarefas muito pequenas, a sobrecarga pode superar os benefícios da paralelização. Profile seu código para determinar se a paralelização está realmente fornecendo uma melhoria de desempenho.

Anterior :

Próximo :
  Os artigos relacionados
·Como formatar uma String em Python 
·Como substituir uma função em Python 
·O que é IndexError em Python 
·Como usar Rope em Python 
·Como escrever uma série de Taylor em Python 
·Como criar outro processo em Python 
·Processos em Python 
·Como carregar uma string em um dicionário Python 
·Como iniciar o ambiente IDLE Python 
·A Função Python Strip 
  Artigos em destaque
·Como fazer o download Websites em VB.NET 
·O que é Infinite Loop em um Mac 
·Como fazer upload de um tema WP para HostGator cPanel 
·Controles GUI Comum /Web App Tela 
·Como aplicar uma função para cada índice na matriz P…
·Como fazer um armazenamento de chaves 
·Como converter um Integer para Binário & Back em Pytho…
·Como posso colocar uma variável em várias linhas para…
·Como se pode verificar qual versão do Java está em se…
·Como atualizar uma linha em Grid View 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados