2010-06-17 8 views
10

Sto cercando di aumentare la velocità nel mio programma e mi è stato detto che le fibre di Ruby sono più veloci dei thread e possono trarre vantaggio da più core. Mi sono guardato intorno, ma non riesco a trovare come eseguire contemporaneamente diverse fibre contemporaneamente. Con le discussioni si può fare questo:Le fibre di color rubino possono essere concomitanti?

threads = [] 

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

threads.each {|thread| thread.join} 

non riesco a vedere come fare qualcosa di simile con le fibre. Tutto quello che posso trovare è yield e resume che sembra solo un po 'di avvio e arresto tra le fibre. C'è un modo per fare una vera concorrenza con le fibre?

+0

Penso che tu intenda il vero parallelismo (come notato da twopoint718 sotto). Le fibre possono essere utilizzate per la concorrenza, quindi i thread. Ma non corrono in parallelo. –

risposta

16

No, non è possibile fare concorrenza con Fiber s. Fiber s semplicemente non sono un costrutto di concorrenza, sono un costrutto del flusso di controllo, come Exception s. Questo è il punto intero di Fiber s: loro mai eseguito in parallelo, sono cooperativi e sono deterministici. Fiber s sono coroutine. (In realtà, non ho mai capito perché non sono semplicemente chiamati Coroutine s.)

L'unico costrutto di concorrenza in Ruby è Thread.

+0

Davvero? Oh bene, è troppo brutto. Ciò significa che il titolo di questo articolo era fuorviante allora: http: //www.infoq.it/news/2007/08/ruby-1-9-fibre –

+4

Ho avuto l'impressione che le co-routines siano una forma di concorrenza, e l'OP in realtà significa chiedere di poter fare _parallelismo_ con le fibre di Ruby (che tu non dovrebbe). –

+4

'Fibre' sono costrutti di concorrenza. – user454322

2

se si desidera una concorrenza reale, si consiglia di utilizzare thread con jruby, credo.

12

Sembra esserci un problema di terminologia tra concorrenza e parallelismo.

Non riesco proprio a trovare come eseguire contemporaneamente diverse fibre contemporaneamente.

Penso che in realtà parla di parallelismo, non si tratta di concorrenza:

concorrenza è quando due attività può iniziare, correre, e completa in sovrapposizione periodi di tempo. Non significa necessariamente che correranno entrambi nello stesso istante. Per esempio. multitasking su una macchina single-core. Il parallelismo si verifica quando le attività vengono eseguite alla stessa ora, ad es. su un processore multicore

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

Inoltre ben illustrata qui: http://concur.rspace.googlecode.com/hg/talk/concur.html#title-slide

Quindi, per rispondere alla domanda:

fibre sono primitive di applicazione leggera concorrenza cooperativa in rubino.

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

Il che non significa che può essere eseguito in parallelo.