Pular para o conteúdo

O runtime: o mapa

Item por item da parte 12 da referência Deep Tech — scheduler assíncrono, green threads e event loop — cruzado com o que o DataForge tem.

A décima segunda parte de uma referência Deep Tech é sobre a arquitetura do runtime. Foi a parte que escolhi fazer depois da 8 por um motivo: das que restavam, era a única que muda o que a linguagem consegue fazer, e não só o que ela documenta.

55 · Scheduler assíncrono#

ItemNo DataForgeOnde
event loopArcane.Laco — poller do sistema, fila de prazos, fila de prontasO laço
task scheduler, work queuesagendar, apos, a_cada, com ordem FIFO e prazos num heapEscalonador
executorsL.executar — o que bloqueia vai para um pool e volta pela filaEscalonador
cooperative schedulingas fibras: cada emit devolve o controleFibras
context switchingo quadro do gerador; sem pilha própria e sem registrador a salvarFibras
cancellationL.cancelar vale para tarefa e para fibra; fechar o gerador roda os deferFibras
backpressureL.novo(teto) — a fila recusa em vez de crescer sem limiteEscalonador
task stealingnão existe: cada laço é uma thread, e com o GIL o ganho some antes de aparecer

56 · Green threads#

ItemNo DataForgeOnde
fibersexistem, e são reais: um stream action dirigido pelo escalonadorFibras
user-space schedulingo escalonador é o do módulo; o SO não sabe que há fibrasFibras
context switchingnext() no gerador — o mais barato que há sem sair do PythonFibras
scheduler integrationa fibra diz o que espera, e o laço a registra no poller ou no heapFibras
stack management, register preservationnão existe, e é a diferença entre fibra e green thread: a corrotina é sem pilha, e um emit dentro de uma ação chamada não suspendeFibras
assembly-level switchingnão se aplica — exigiria assembly ou extensão em C, e a linguagem não tem dependência externa

57 · Event loop#

ComponenteNo DataForgeOnde
I/O Pollerselectors.DefaultSelector — o melhor que o sistema ofereceO laço
Timer Queueheap de prazos, com desempate estávelEscalonador
Task Queuefila FIFO com teto opcionalEscalonador
Executorpool de threads para o que bloqueiaEscalonador
Reactor, Schedulersão o mesmo objeto: LacoO laço
epollno Linux, automaticamenteO laço
kqueueno macOS e no BSD, automaticamenteO laço
IOCPnão: no Windows o selectors usa select, com teto de 512 descritores. É o limite desta forma, e está dito em vez de escondido
io_uringnão existe: só Linux, e pelo CPython exigiria extensão em C

O resumo honesto#

Das três seções, duas estão inteiras (§55 e §57, menos work stealing, IOCP e io_uring) e a terceira está pela metade — pela metade certa: as fibras existem e funcionam, e o que falta delas (pilha própria) é exatamente o que exigiria sair do Python.