Concorrência avançada
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.
Item No DataForge Onde threads thread: e parallel:, com erro que sobe em vez de sumirConcorrência tasks, futures C.rodar devolve tarefa; C.esperar, esperar_todas, esperar_primeiraConcorrência async/await async action + await — concorrência de E/S de verdadeConcorrência promises C.promessa(): cumprir, falhar, esperarSem trava executors, thread pools C.executor(n) com submeter, mapear, fecharSem trava event loops nã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 passing C.canal(capacidade) — receber espera; receive sem prazo nãoConcorrência shared state existe, e não é protegido sozinho: o check avisa (escrita-concorrente) Análise estática locks, mutex, RwLock, semáforos, barriers mutex, com_trava, trava_leitura_escrita, semaforo, barreira, evento, condicaoConcorrência
Item No DataForge Onde STM, transações Arcane.Stm: variavel e atomicamenteSTM atomicidade, rollback erro no meio desfaz o rascunho e sobe — nada é publicado STM isolamento, consistência a transação lê a própria escrita e valida as versões no commit STM composição de transações aninhar é achatar: duas transacionais dentro de uma terceira são uma só STM controle de conflitos otimista: conflito custa repetição, e as estatísticas dizem quanto STM concorrência sem locks tradicionais sim — a trava existe só no commit, e é curta STM
Item No DataForge Onde CAS C.atomico(v).comparar_e_trocar(esperado, novo)Sem trava operações atômicas pegar, definir, trocar, somar, pegar_e_somar, atualizarSem trava filas e pilhas lock-free C.fila_sem_trava(), C.pilha_sem_trava() — append/pop são indivisíveis em CSem trava ring buffers C.anel(n): o mais velho sai quando encheSem trava wait-free não existe como garantia: o laço de CAS é lock-free, não wait-free— ABA problem acontece; a saída é guardar um selo junto do valor Sem trava hazard pointers, epoch reclamation não se aplicam : o coletor resolve a liberação que elas endereçam—
Item No DataForge Onde atomic load/store, CAS, fetch-add todos, em C.atomico Sem trava acquire, release, relaxed, seq-cst não se aplicam : o GIL já serializa as operações Python, e não há ordenação a escolhermemory fences, barriers de memória não existem como instrução; C.barreira(n) é outra coisa — sincroniza threads, não memóriamodelo de memória da CPU, reordenação não é observável daqui: a reordenação existe no processador, e o runtime não a expõe
Item No DataForge Onde parallel loops, data parallelism C.map, C.para_cada, C.lotes; e C.map_processos para CPUParalelismo thread pools, task scheduling C.executor(n), C.pool_processos(), C.grupo()Sem trava pipeline parallelism Arcane.Pipeline — etapas com dependência, ordem topológica e históricoPipelines work stealing não existe : o pool distribui, e não rouba — a diferença só aparece com tarefas muito desiguaisSIMD não existe na linguagem; a vetorização vem pela ponte (adopt Python.numpy), sem cópia na fronteiraPonte GPU computing não existe : o caminho é a ponte para uma biblioteca que já fale com a GPUNUMA awareness não existe : o runtime não escolhe nó de memória
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.
A regra que vale para tudo isto
A linguagem não sincroniza sozinha . O dataforge check avisa quando um thread, parallel ou route escreve num nome que vem de fora (escrita-concorrente) — inclusive na forma v["n"] := …, que é a que mais engana. É aviso, e não erro: um acumulador protegido por mutex passa por ali igual.
Anterior
← Atômicos e sem trava
Próximo
Posse e empréstimo →