Esta é provavelmente uma pergunta trivial, mas como eu paralelo o seguinte loop em python?
# setup output lists
output1 = list()
output2 = list()
output3 = list()
for j in range(0, 10):
# calc individual parameter value
parameter = j * offset
# call the calculation
out1, out2, out3 = calc_stuff(parameter = parameter)
# put results into correct output list
output1.append(out1)
output2.append(out2)
output3.append(out3)
Eu sei como iniciar threads únicos em Python, mas não sei como "coletar" os resultados.
Vários processos também seriam bons - o que for mais fácil para este caso. Atualmente, estou usando o Linux, mas o código também deve ser executado no Windows e no Mac.
Qual é a maneira mais fácil de paralelizar esse código?
fonte
calc_stuff
?multiprocessing
módulo para obter exemplos mais abrangentes.Pool.map()
basicamente funciona comomap()
, mas em paralelo.Para paralelizar um loop for simples, o joblib agrega muito valor ao uso bruto do multiprocessamento. Não apenas a sintaxe curta, mas também coisas como agrupamento transparente de iterações quando elas são muito rápidas (para remover a sobrecarga) ou a captura do retorno do processo filho, para obter melhores relatórios de erros.
Disclaimer: Eu sou o autor original do joblib.
fonte
Eu realmente gosto
concurrent.futures
disso, disponível no Python3 desde a versão 3.2 - e via backport para 2.6 e 2.7 no PyPi .Você pode usar threads ou processos e usar exatamente a mesma interface.
Multiprocessamento
Coloque isso em um arquivo - futuretest.py:
E aqui está a saída:
Multithreading
Agora mude
ProcessPoolExecutor
paraThreadPoolExecutor
e execute o módulo novamente:Agora você fez o multithreading e o multiprocessing!
Nota sobre desempenho e uso dos dois juntos.
A amostragem é muito pequena para comparar os resultados.
No entanto, suspeito que o multithreading será mais rápido que o multiprocessamento em geral, especialmente no Windows, já que o Windows não suporta bifurcação, portanto, cada novo processo precisa levar algum tempo para ser iniciado. No Linux ou Mac, eles provavelmente estarão mais próximos.
Você pode aninhar vários threads em vários processos, mas é recomendável não usar vários threads para desativar vários processos.
fonte
O exemplo acima funciona muito bem na minha máquina (Ubuntu, o pacote joblib foi pré-instalado, mas pode ser instalado via
pip install joblib
).Retirado de https://blog.dominodatalab.com/simple-parallelization/
fonte
Há várias vantagens em usar o Ray :
No seu caso, você pode iniciar o Ray e definir uma função remota
e depois invocá-lo em paralelo
Para executar o mesmo exemplo em um cluster, a única linha que mudaria seria a chamada para ray.init (). A documentação relevante pode ser encontrada aqui .
Note que estou ajudando a desenvolver Ray.
fonte
Esta é a maneira mais fácil de fazer isso!
Você pode usar asyncio . (A documentação pode ser encontrada aqui ). É usado como base para várias estruturas assíncronas Python que fornecem servidores de rede e servidores de alta performance, bibliotecas de conexão de banco de dados, filas de tarefas distribuídas etc. Além disso, possui APIs de alto e baixo nível para acomodar qualquer tipo de problema .
Agora, essa função será executada em paralelo sempre que chamada, sem colocar o programa principal no estado de espera. Você pode usá-lo para paralelizar o loop for também. Quando chamado para um loop for, o loop é seqüencial, mas toda iteração é executada paralelamente ao programa principal assim que o intérprete chega. Por exemplo:
Isso produz a seguinte saída:
fonte
wrapped()
e deve ser em**kwargs
vez de*kwargs
por que você não usa threads e um mutex para proteger uma lista global?
lembre-se, você será tão rápido quanto o seu fio mais lento
fonte
Eu achei
joblib
muito útil para mim. Por favor, veja o seguinte exemplo:n_jobs = -1: use todos os núcleos disponíveis
fonte
joblib
.Digamos que temos uma função assíncrona
Isso precisa ser executado em uma grande variedade. Alguns atributos estão sendo passados para o programa e outros são usados a partir da propriedade do elemento de dicionário na matriz.
fonte
Veja isso;
http://docs.python.org/library/queue.html
Pode não ser o caminho certo, mas eu faria algo assim;
Código atual;
Espero que ajude.
fonte
Isso pode ser útil ao implementar o multiprocessamento e a computação paralela / distribuída no Python.
Tutorial do YouTube sobre o uso do pacote techila
O Techila é um middleware de computação distribuída, que se integra diretamente ao Python usando o pacote techila. A função pêssego na embalagem pode ser útil em estruturas de loop paralelizadas. (O trecho de código a seguir é dos fóruns da comunidade Techila )
fonte
obrigado @iuryxavier
fonte
Um exemplo muito simples de processamento paralelo é
fonte