Sobes.tech
Middle+

O que é Fiber em Ruby?

sobes.tech IA

Resposta da IA

Fiber em Ruby é um fio de execução leve (coroutine) que permite criar múltiplos fios de execução paralelos dentro de um único processo/fio do sistema operativo. Isto permite gerir a ordem de execução do código, alternando entre Fiber sem envolver o agendador do sistema operativo.

Características principais do Fiber:

  • Agendamento cooperativo: Os Fiber não são preemptados pelo núcleo do sistema operativo. A troca entre eles ocorre explicitamente através dos métodos resume e yield.
  • Fio único: Todos os Fiber num mesmo fio executam-se sequencialmente, mas a troca entre eles cria uma ilusão de paralelismo para o código dentro do fio.
  • Preservação de estado: O Fiber lembra-se do seu estado (variáveis locais, ponto de execução) ao chamar yield e retoma-o ao chamar resume.

Aplicações do Fiber:

  • Implementação de código assíncrono: Modelar operações não bloqueantes sem usar callbacks ou construções complexas.
  • Iteradores e geradores: Criar iteradores complexos que geram valores sob demanda.
  • Gestão de autómatos finitos: Modelar estados e transições de forma explícita.

Exemplo de uso:

# Criar um Fiber
fiber = Fiber.new do
  puts "Olá do Fiber 1"
  value1 = Fiber.yield(1) # Pausa a execução, devolve 1
  puts "Recebido do Fiber 1: #{value1}"

  puts "Olá do Fiber 2"
  value2 = Fiber.yield(2) # Pausa a execução, devolve 2
  puts "Recebido do Fiber 2: #{value2}"

  puts "Olá do Fiber 3"
  3 # Finaliza o Fiber, devolve 3
end

puts "Main: Antes do primeiro resume"
result1 = fiber.resume # Reanima a execução do Fiber
puts "Main: Recebido do Fiber: #{result1}"

puts "Main: Antes do segundo resume"
result2 = fiber.resume("de Main 1") # Reanima e passa valor
puts "Main: Recebido do Fiber: #{result2}"

puts "Main: Antes do terceiro resume"
result3 = fiber.resume("de Main 2") # Reanima e passa valor
puts "Main: Recebido do Fiber: #{result3}"

Métodos principais:

  • Fiber.new { ... }: Cria um novo Fiber. O bloco de código é executado na primeira chamada a resume.
  • fiber.resume(*args): Reanima a execução do Fiber. Os argumentos passados a resume tornam-se o valor devolvido por Fiber.yield ou nos argumentos do bloco que o iniciou.
  • Fiber.yield(*args): Pausa a execução do Fiber atual e devolve o controlo ao código que o iniciou (resume). Os argumentos passados a yield tornam-se o valor devolvido por resume.
  • Fiber.current: Retorna o Fiber atual.

Diferenças entre Fiber e Thread:

Característica Fiber Thread
Agendamento Cooperativo (troca explícita) Preemptivo (pelo sistema operativo)
Recursos Leves (menos recursos) Mais pesados (mais recursos)
Paralelismo Falso paralelismo num só fio Paralelismo verdadeiro (usa núcleos CPU)
Comunicação Via yield e resume Via memória partilhada, mensagens, etc.
Depuração Relativamente mais simples (fluxo linear) Mais complexa (condições de corrida, bloqueios)

Os Fiber fornecem um mecanismo de controlo de execução de nível inferior em comparação com os Thread, exigindo uma gestão explícita das mudanças de contexto.