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
resumeeyield. - 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
yielde retoma-o ao chamarresume.
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 aresume.fiber.resume(*args): Reanima a execução do Fiber. Os argumentos passados aresumetornam-se o valor devolvido porFiber.yieldou 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 ayieldtornam-se o valor devolvido porresume.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.