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.