2010-06-17 20 views
10

Estoy tratando de acelerar un poco en mi programa y me han dicho que las fibras de rubí son más rápidas que los hilos y pueden aprovechar los múltiples núcleos. Miré a mi alrededor, pero no puedo encontrar la forma de ejecutar diferentes fibras al mismo tiempo. Con los hilos puede hacer esto:¿Pueden las fibras de rubí ser concurrentes?

threads = [] 

threads << Thread.new {Do something} 
threads << Thread.new {Do something} 

threads.each {|thread| thread.join} 

No puedo ver cómo hacer algo como esto con las fibras. Todo lo que puedo encontrar es yield y resume que parece ser solo un montón de arranque y parada entre las fibras. ¿Hay alguna forma de hacer verdadera concurrencia con fibras?

+0

Creo que te refieres al verdadero paralelismo (como lo señala twopoint718 a continuación). Las fibras se pueden usar para concurrencia, también pueden usarse hilos. Pero no se ejecutan en paralelo. –

Respuesta

16

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

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

+0

¿De verdad? Oh bueno, eso es muy malo. Eso significa que el título de este artículo fue engañoso entonces: http: //www.infoq.com/news/2007/08/ruby-1-9-fibers –

+4

Tenía la impresión de que las co-rutinas son una forma de concurrencia, y el OP de hecho quiere decir preguntar ¿puedes hacer _parallelismo_ con fibras de Ruby (que no debería). –

+4

'Fibras' son construcciones de concurrencia. – user454322

2

si quiere concurrencia verdadera, querrá usar hilos con jruby, creo.

12

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

Simplemente no puedo encontrar cómo ejecutar diferentes fibras al mismo tiempo.

Creo que en realidad se habla de paralelismo, no se trata de la concurrencia:

concurrencia es cuando dos tareas se pueden iniciar, ejecutar, y completa en períodos de tiempo superpuestos. No necesariamente significa que ambos estarán funcionando en el mismo instante. P.ej. multitarea en una máquina de un solo núcleo. Paralelismo es cuando las tareas se ejecutan literalmente al mismo tiempo, por ejemplo. en un procesador multinúcleo

Citando: Concurrency vs Parallelism - What is the difference?.

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 la implementación de peso ligero concurrencia de cooperación en Ruby.

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

cual no quiere decir que se puede ejecutar en paralelo.

Cuestiones relacionadas