Descobri que no Python 3.4 existem poucas bibliotecas diferentes para multiprocessamento / threading: multiprocessamento vs threading vs asyncio .
Mas não sei qual usar ou é o "recomendado". Eles fazem a mesma coisa ou são diferentes? Em caso afirmativo, qual é usado para quê? Quero escrever um programa que use multicores no meu computador. Mas não sei qual biblioteca devo aprender.
python
multithreading
python-3.x
multiprocessing
python-asyncio
user3654650
fonte
fonte
Respostas:
Eles são destinados a finalidades e / ou requisitos (ligeiramente) diferentes. CPython (uma implementação típica do Python principal) ainda tem o bloqueio do interpretador global, então um aplicativo multi-threaded (uma forma padrão de implementar processamento paralelo atualmente) é subótimo. É por isso que
multiprocessing
pode ser preferívelthreading
. Mas nem todo problema pode ser efetivamente dividido em partes [quase independentes], portanto, pode haver uma necessidade de comunicações inter-processos pesadas. É por issomultiprocessing
que não pode ser preferidothreading
em geral.asyncio
(esta técnica está disponível não apenas em Python, outras linguagens e / ou frameworks também a têm, por exemplo, Boost.ASIO ) é um método para lidar com muitas operações de I / O de muitas fontes simultâneas sem a necessidade de execução paralela de código . Portanto, é apenas uma solução (boa mesmo!) Para uma tarefa específica, não para o processamento paralelo em geral.fonte
[Resposta rápida]
TL; DR
Fazendo a escolha certa:
Referência
[ NOTA ]:
asyncio
um loop de eventos ultrarrápido ( uvloop tornaasyncio
2-4x mais rápido).[ATUALIZAÇÃO (2019)]:
fonte
asyncio
quando usar funções em espera,request
biblioteca não é um método em espera, em vez de usar como aaiohttp
biblioteca ou solicitação assíncrona e etc.Esta é a ideia básica:
Então, basicamente, mantenha o threading, a menos que você tenha problemas de E / S / CPU.
fonte
No multiprocessamento, você aproveita várias CPUs para distribuir seus cálculos. Como cada uma das CPUs funciona em paralelo, você é capaz de executar várias tarefas simultaneamente. Você gostaria de usar multiprocessamento para tarefas vinculadas à CPU . Um exemplo seria tentar calcular a soma de todos os elementos de uma lista enorme. Se sua máquina tiver 8 núcleos, você pode "cortar" a lista em 8 listas menores e calcular a soma de cada uma dessas listas separadamente em núcleos separados e, em seguida, apenas somar esses números. Você obterá uma aceleração de ~ 8x ao fazer isso.
Em threadingvocê não precisa de múltiplas CPUs. Imagine um programa que envia muitas solicitações HTTP para a web. Se você usasse um programa de thread único, ele interromperia a execução (bloco) a cada solicitação, aguardaria uma resposta e, em seguida, continuaria assim que recebesse uma resposta. O problema aqui é que sua CPU não está realmente funcionando enquanto espera que algum servidor externo faça o trabalho; ele poderia realmente ter feito algum trabalho útil nesse ínterim! A solução é usar threads - você pode criar muitos deles, cada um responsável por solicitar algum conteúdo da web. A coisa boa sobre threads é que, mesmo se eles rodarem em uma CPU, a CPU de vez em quando "congela" a execução de uma thread e pula para a execução da outra (é chamada de troca de contexto e acontece constantemente em não determinística intervalos). - use threading.
asyncio é essencialmente threading onde não a CPU, mas você, como um programador (ou na verdade sua aplicação), decide onde e quando a troca de contexto acontece . Em Python, você usa uma
await
palavra-chave para suspender a execução de sua co-rotina (definida usando aasync
palavra-chave).fonte