Pular para o conteúdo

Laço, thread, async ou processo

Quatro modelos de concorrência, o que cada um resolve, e o GIL que decide metade da escolha.

A pergunta que decide o modelo não é "quero paralelismo?", e sim "o trabalho espera ou calcula?". Esperar (rede, disco, banco) sobrepõe bem em uma thread; calcular exige núcleos de verdade, e no CPython isso quer dizer processos.

ModeloServe paraCustoNão serve para
Arcane.Lacomilhares de conexões esperando1 thread, ~1 MBconta pesada (trava o laço)
thread: / parallel:poucas esperas simultâneas, código simples~36 MB para mil threadsmilhares de conexões; conta pesada (GIL)
async / awaitE/S concorrente com código sequencialuma thread por tarefaconta pesada (GIL)
P.map_processosconta pesada em vários núcleos~50 ms de partida por processotrabalho pequeno (a partida domina)
atorestado que várias threads alteram1 thread por ator

Medido#

ConexõesLaçoThread por conexão
100073 ms · 1 thread · +1 MB83 ms · 1000 threads · +36 MB
2000151 ms · 1 thread · +0 MB161 ms · 2000 threads · +36 MB

O tempo quase empata — e esse é o número honesto. O que muda é a forma da conta: a memória e as threads do laço ficam planas, e as do modelo por conexão crescem em linha reta até algo quebrar.