0Pricing
Ruby Academy · Aula

O GVL explicado

Por que as threads são limitadas.

O GVL explicado é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ruby Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ruby Academy inclui 4 aulas no total.

O que é o GVL?

O GVL (bloqueio global da VM, historicamente o GIL) é um bloqueio dentro do CRuby, o interpretador padrão do Ruby.

  • Ele permite que apenas uma linha de execução execute código Ruby por vez.
  • Ele protege os componentes internos do interpretador contra corrupção concorrente.
  • Isso significa que o trabalho de CPU em Ruby puro não é realmente executado em paralelo em vários núcleos.

Entender o GVL explica quando as linhas de execução ajudam e quando não ajudam.

Por que ele existe

Os componentes internos do CRuby (alocação de objetos, coleta de lixo e extensões em C) não foram todos escritos para serem seguros em relação a linhas de execução. O GVL os torna seguros ao serializar a execução do Ruby.

Removê-lo de forma adequada é difícil, por isso o CRuby o mantém. O JRuby e o TruffleRuby não têm um GVL e podem executar linhas de execução em vários núcleos.

Trabalho dependente da CPU

Para tarefas dependentes da CPU (matemática, ordenação e análise), as linhas de execução não aceleram o trabalho no CRuby. Apenas uma linha de execução executa código Ruby em qualquer instante, portanto duas linhas de execução de CPU equivalem aproximadamente a uma linha de execução, mais a sobrecarga.

def heavy
  sum = 0
  1_000_00.times { |i| sum += i }
  sum
end

puts heavy
puts "CPU work does not parallelize under the GVL"

A E/S libera o GVL

A ideia principal é: a E/S bloqueante libera o GVL. Quando uma linha de execução faz uma pausa, lê um arquivo ou espera em um soquete, ela libera o bloqueio para que outra linha de execução possa executar Ruby.

É por isso que as linhas de execução são excelentes para trabalhos dependentes de E/S mesmo com o GVL.

Esperas sobrepostas

Aqui, três linhas de execução fazem uma pausa. Como sleep libera o GVL, as esperas se sobrepõem. O tempo total é de aproximadamente 0,2 s, não 0,6 s.

start = Time.now

threads = (1..3).map do
  Thread.new { sleep 0.2 }
end
threads.each(&:join)

elapsed = Time.now - start
puts "Elapsed roughly: " + elapsed.round(1).to_s

Extensões em C podem liberá-lo

Extensões em C bem escritas podem liberar o GVL durante cálculos nativos longos usando rb_thread_call_without_gvl. Isso permite que trabalhos nativos pesados sejam executados em paralelo enquanto as linhas de execução do Ruby continuam.

Assim, algumas bibliotecas alcançam paralelismo real mesmo no CRuby.

As linhas de execução ainda alternam

Mesmo para trabalhos de CPU, o GVL não congela as outras linhas de execução para sempre. O CRuby interrompe uma linha de execução periodicamente para que cada uma tenha sua vez. O trabalho é concorrente (intercalado), mas não paralelo (simultâneo).

results = []
mutex = Mutex.new

threads = (1..3).map do |n|
  Thread.new do
    mutex.synchronize { results << n }
  end
end
threads.each(&:join)

puts "Collected: " + results.sort.join(", ")

Concorrência vs. paralelismo

Duas palavras importantes:

  • Concorrência: as tarefas progridem por meio de intercalação. O GVL permite isso.
  • Paralelismo: as tarefas são executadas exatamente no mesmo instante, em núcleos diferentes. O GVL impede isso para o código Ruby.

As linhas de execução oferecem concorrência; os atores oferecem paralelismo.

Contornando o GVL

Para usar vários núcleos em trabalhos de CPU no CRuby, você pode:

  • Executar vários processos (cada um tem seu próprio GVL).
  • Usar atores para obter paralelismo dentro do processo.
  • Delegar o trabalho a extensões em C que liberam o GVL.

Para trabalhos de E/S, linhas de execução comuns geralmente são suficientes.

Processos não compartilham o GVL

Cada processo do OS executa sua própria VM Ruby com seu próprio GVL. Criar processos derivados gera paralelismo real, mas os processos não compartilham a memória e usam mais recursos.

puts "Main pid: " + Process.pid.to_s
puts "Each forked process has its own independent GVL"

Escolhendo uma estratégia

Guia de decisão:

  • Muita espera? Use linhas de execução.
  • CPU pesada e necessidade de usar os núcleos? Use processos ou atores.
  • Precisa de estado compartilhado? Use linhas de execução com um Mutex, mas tenha em mente as limitações do GVL.

Conhecer o GVL evita o erro clássico de esperar que as linhas de execução de CPU escalem linearmente.

Verificação rápida

Teste sua compreensão sobre o GVL.

Recapitulação: o GVL

Principais conclusões sobre o bloqueio global da VM:

  • Apenas uma linha de execução executa código Ruby por vez no CRuby.
  • Ele protege os componentes internos do interpretador.
  • A E/S bloqueante o libera, permitindo que as esperas se sobreponham.
  • O trabalho de Ruby dependente da CPU não é paralelizado entre vários núcleos.
  • Use processos ou atores para obter paralelismo real.

A seguir, veremos as fibras, que oferecem concorrência cooperativa e leve.

Perguntas Frequentes

A aula “O GVL explicado” é grátis?

Sim — o texto completo de “O GVL explicado” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ruby Academy, atualize para CoddyKit PRO. O curso de Ruby Academy inclui 4 aulas no total.

O que vou aprender em “O GVL explicado”?

Por que as threads são limitadas. Você pratica Ruby Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Ruby Academy?

Nenhuma experiência prévia é necessária. Ruby Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “O GVL explicado”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Ruby Academy?

Sim. Cada aula de Ruby Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Threads
  2. O GVL explicado
  3. Fibras
  4. Ractors
← Voltar para Ruby Academy