# Concorrência em Ruby

> "Ruby não escala!"

Quem nunca ouviu essa frase antes? *Ela tem um fundo de verdade,* mas muita inconsistênci&#x61;*.* Neste módulo, vamos abordar todos os aspectos de concorrência em Ruby e tentar desmistificar algumas afirmações como "não dá pra paralelizar com Ruby" ou até mesmo "Ruby não tem multi-threading".

Estas afirmações costumam vir carregadas de desconhecimento. Ruby traz um suporte muito robusto a concorrência, inclusive nas versões modernas.

> Muito do que dizem "Ruby é lento" é na verdade com relação ao Ruby antigo 1.8, que vamos comentar um pouco mais a seguir

## Já viu o módulo "Concorrência em C" antes?

Se você chegou até aqui, acredito que já tenha lido o primeiro módulo deste capítulo II sobre *Concorrência em C*. Caso contrário, apesar de que seja altamente *recomendado* que faça primeiro o módulo de C (não é complexo, eu garanto), cada módulo sobre as linguagens de alto nível foi pensado para ser **independente**.

Portanto, se você já tem um bom conhecimento sobre concorrência no geral e todo o vocabulário envolvido mas tem interesse em apenas aprender como funciona **concorrência em Ruby,** não há problema se quiser ler apenas este módulo.

> Entretanto se você pular o módulo de C, pode ser que se sinta perdido(a) em alguns pontos, mas recomendo fortemente que leia antes a primeira parte do guia, sobre *Concorrência no Sistema Operacional*

***

## Preâmbulo

A implementação de Ruby mais amplamente utilizada é o interpretador **CRuby** (escrita em C), também conhecido popularmente como **MRI**, que vem de *Matz Ruby Interpreter.*

> Se você tem interesse em algo introdutório sobre a linguagem Ruby, eu escrevi [este artigo](https://dev.to/leandronsp/a-comprehensive-introduction-to-ruby-8o7) que aborda sua história, principais características e funcionalidades.

Os exemplos aqui trazidos funcionam na última versão estável do interpretador atualmente - Jan/2025 -, que é a `3.4.1` .

No que diz respeito à concorrência, [**Ruby 3.4.1**](https://www.ruby-lang.org/en/documentation/installation/) traz consigo na biblioteca padrão:

* Forking de processos
* Kernel Threads e sincronização de threads
* Modelo de atores (ainda experimental)
* Fibers (porém o escalonamento precisa ser implementado por nós)
* I/O não-bloqueante e monitoramento de descritores, através de `IO.select`&#x20;

E através de bibliotecas externas (gems), podemos ter tudo o que a biblioteca padrão já traz, inclusive:

* Implementações mais robustas de threading/forking
* Implementação de Thread Pool (embora não seja complexo implementar uma pool, como vimos em C, pelo que em Ruby é *flocos com morango*)
* I/O assíncrono, com loop de eventos, suporte a epoll etc

Vamos ver tudo isto em detalhes nos próximos tópicos.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://concorrencia101.leandronsp.com/parte-ii-concorrencia-em-diferentes-linguagens/concorrencia-em-ruby.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
