Pular para o conteúdo

Concorrência e paralelismo: o mapa

Item por item da parte 4 da referência Deep Tech — concorrência, STM, lock-free, atomics e paralelismo — cruzado com o que o DataForge tem.

A quarta parte de uma referência Deep Tech cobre concorrência, memória transacional, estruturas sem trava, atômicos com ordenação de memória e paralelismo. Abaixo, item por item, com o que existe aqui e o que não existe — com o motivo.

17 · Concorrência#

ItemNo DataForgeOnde
threadsthread: e parallel:, com erro que sobe em vez de sumirConcorrência
tasks, futuresC.rodar devolve tarefa; C.esperar, esperar_todas, esperar_primeiraConcorrência
async/awaitasync action + await — concorrência de E/S de verdadeConcorrência
promisesC.promessa(): cumprir, falhar, esperarSem trava
executors, thread poolsC.executor(n) com submeter, mapear, fecharSem trava
event loopsnão existe um laço de eventos próprio: async roda sobre threads, e a E/S bloqueante se sobrepõe de fato
channels, message passingC.canal(capacidade)receber espera; receive sem prazo nãoConcorrência
shared stateexiste, e não é protegido sozinho: o check avisa (escrita-concorrente)Análise estática
locks, mutex, RwLock, semáforos, barriersmutex, com_trava, trava_leitura_escrita, semaforo, barreira, evento, condicaoConcorrência

18 · Memória transacional#

ItemNo DataForgeOnde
STM, transaçõesArcane.Stm: variavel e atomicamenteSTM
atomicidade, rollbackerro no meio desfaz o rascunho e sobe — nada é publicadoSTM
isolamento, consistênciaa transação lê a própria escrita e valida as versões no commitSTM
composição de transaçõesaninhar é achatar: duas transacionais dentro de uma terceira são uma sóSTM
controle de conflitosotimista: conflito custa repetição, e as estatísticas dizem quantoSTM
concorrência sem locks tradicionaissim — a trava existe só no commit, e é curtaSTM

19 · Lock-free e wait-free#

ItemNo DataForgeOnde
CASC.atomico(v).comparar_e_trocar(esperado, novo)Sem trava
operações atômicaspegar, definir, trocar, somar, pegar_e_somar, atualizarSem trava
filas e pilhas lock-freeC.fila_sem_trava(), C.pilha_sem_trava()append/pop são indivisíveis em CSem trava
ring buffersC.anel(n): o mais velho sai quando encheSem trava
wait-freenão existe como garantia: o laço de CAS é lock-free, não wait-free
ABA problemacontece; a saída é guardar um selo junto do valorSem trava
hazard pointers, epoch reclamationnão se aplicam: o coletor resolve a liberação que elas endereçam

20 · Atomics e memory ordering#

ItemNo DataForgeOnde
atomic load/store, CAS, fetch-addtodos, em C.atomicoSem trava
acquire, release, relaxed, seq-cstnão se aplicam: o GIL já serializa as operações Python, e não há ordenação a escolher
memory fences, barriers de memórianão existem como instrução; C.barreira(n) é outra coisa — sincroniza threads, não memória
modelo de memória da CPU, reordenaçãonão é observável daqui: a reordenação existe no processador, e o runtime não a expõe

21 · Paralelismo#

ItemNo DataForgeOnde
parallel loops, data parallelismC.map, C.para_cada, C.lotes; e C.map_processos para CPUParalelismo
thread pools, task schedulingC.executor(n), C.pool_processos(), C.grupo()Sem trava
pipeline parallelismArcane.Pipeline — etapas com dependência, ordem topológica e históricoPipelines
work stealingnão existe: o pool distribui, e não rouba — a diferença só aparece com tarefas muito desiguais
SIMDnão existe na linguagem; a vetorização vem pela ponte (adopt Python.numpy), sem cópia na fronteiraPonte
GPU computingnão existe: o caminho é a ponte para uma biblioteca que já fale com a GPU
NUMA awarenessnão existe: o runtime não escolhe nó de memória

O resumo honesto#

Das cinco seções, três e meia têm resposta aqui: concorrência (completa), STM (nova), lock-free no que o GIL permite garantir de verdade, e paralelismo de dados com processos. O que não existe divide-se em duas classes — o que o GIL torna sem sentido (ordenação de memória, fences) e o que exige descer ao hardware (SIMD, GPU, NUMA), que é justamente onde a ponte para o Python entra.