¿Pueden las fibras de Ruby ser concurrentes?

Estoy tratando de acelerar mi progtwig y me han dicho que las Fibras de Rubí son más rápidas que los hilos y pueden aprovechar múltiples núcleos. He mirado a mi alrededor, pero simplemente no puedo encontrar cómo ejecutar diferentes fibras simultáneamente. Con hilos puedes hacer esto:

threads = [] threads << Thread.new {Do something} threads << Thread.new {Do something} threads.each {|thread| thread.join} 

No puedo ver cómo hacer algo así con las fibras. Todo lo que puedo encontrar es el yield y el resume que parece ser solo un montón de comenzar y detenerse entre las fibras. ¿Hay una manera de hacer verdadera concurrencia con las fibras?

No, no puedes hacer concurrencia con Fiber s. Fiber simplemente no son una construcción de concurrencia, son una construcción de flujo de control, como las Exception . Ese es el punto Fiber de Fiber s: nunca se ejecutan en paralelo, son cooperativos y son deterministas. Fiber s son las coroutinas. (De hecho, nunca entendí por qué no se llaman simplemente Coroutine ).

La única construcción de concurrencia en Ruby es Thread .

Parece que hay un problema de terminología entre la concurrencia y el paralelismo.

Simplemente no puedo encontrar la forma de ejecutar diferentes fibras al mismo tiempo.

Creo que realmente hablas de paralelismo, no de concurrencia:

La concurrencia es cuando dos tareas pueden iniciarse, ejecutarse y completarse en períodos de tiempo superpuestos. No significa necesariamente que ambos se ejecutarán en el mismo instante. P.ej. Multitarea en una máquina de un solo núcleo. El paralelismo es cuando las tareas se ejecutan literalmente al mismo tiempo, por ejemplo. en un procesador multinúcleo

Citar: Concurrencia vs Paralelismo – ¿Cuál es la diferencia? .

También bien ilustrado aquí: http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide

Así que para responder a la pregunta:

Las fibras son primitivas para implementar la concurrencia cooperativa de peso ligero en Ruby.

http://www.ruby-doc.org/core-2.1.1/Fiber.html

Lo que no significa que pueda correr en paralelo.

Si desea una verdadera concurrencia, querrá usar hilos con jruby (que en realidad no tiene fibras, solo tiene hilos, uno por fibra).

Otra opción es “bifurcar” a nuevos procesos, que podrían funcionar en paralelo real en MRI.