The em-synchrony project wraps a bunch of EventMachine code in fibers: http://github.com/igrigorik/em-synchrony
I know the author was looking at MacRuby and trying to figure out if fibers worked just the other day. dan On 2010-08-11, at 1:19 PM, Matt Massicotte wrote: > Could you share some, or maybe provide a link? I'm interested in the topic, > but unfamiliar with any specific use-cases. > > Matt > > On Aug 11, 2010, at 10:15 AM, Logan Bowers wrote: > >> +1 for fibers. There is a class of problems made much simpler and/or >> possible with fibers that are not viable w/threads. >> >> Would love to see this make its way into MacRuby. >> >> Sent from my iPhone >> >> On Aug 11, 2010, at 6:06 AM, Scott Thompson <ea...@mac.com> wrote: >> >>> >>> On Aug 11, 2010, at 7:23 AM, Louis-Philippe wrote: >>> >>>> Hi Scott, >>>> >>>> If you haven't done so already, you might want to have a look at: >>>> http://www.macruby.org/documentation/gcd.html >>>> >>>> it speaks of MacRuby integrating Apple's latest multi-threading strategy: >>>> Grand Central Dispatch. >>> >>> Grand Central Dispatch is a fine technology, and goes a long way toward >>> making concurrency much easier to implement. But concurrent execution is >>> only one form of multitasking and GCD is not a general solution to all >>> multitasking problems. In this particular case we are talking about >>> cooperatively scheduled coroutines which is multitasking, but not >>> necessarily concurrency. >>> >>> In Grand Central Dispatch, work is broken up in to a number of small units >>> and those units are dispatched to queues. Eventually a preemptive thread >>> will come along and pick up that work, run it (possibly in parallel with >>> other bits of work). When a thread runs some of the work, however, it runs >>> that work all the way through. >>> >>> Contrast that with a Fiber. Like a block, a fiber represents a unit of >>> work you need to do, but it's work you can turn your attention to... spend >>> some time on, and then put down again at predefined spots. Later, when you >>> are ready, you can pick up that work and continue at the same spot. This >>> is multitasking, but not concurrency. Consider a simple example: >>> >>> my_fiber = Fiber.new do >>> number = 0 >>> loop do >>> Fiber.yield number >>> number = number + 1 >>> end >>> end >>> >>> >> my_fiber.resume >>> => 0 >>> >>> >> my_fiber.resume >>> => 1 >>> >>> This is a coroutine. It has it's own execution context which is started >>> with the first resume, runs up until the yield, and then suspends >>> execution. This is a simple example, but the coroutine could be calling >>> other subroutines, or other complex tasks, with the yield suspending >>> execution at any point along the way. At some point in the future, resume >>> may be called again and execution continues where it left off up until the >>> next time yield is called. >>> >>> This type of multitasking would be hard to implement using GCD because GCD >>> focuses on concurrency. Since each GCD block runs to completion, the >>> solution would involve breaking up the Ruby code using the yield statements >>> as boundaries and then dispatching those blocks to a queue. But that >>> solution would quickly become untenable if you consider that the yield >>> statements might come... say... in the middle of a case:while statement, or >>> in the middle of a complex subroutine chain. >>> >>> Another solution you might come up with is to submit the whole Fiber's >>> block as a single GCD block and implement the yield as acquiring some >>> multiprocessing lock (a semaphore or a condition lock for example). If you >>> do that, then you've got the added overhead of a concurrency lock for each >>> yield and you've submitted a GCD block to a queue that contains an infinite >>> loop. That block is going to sit at the end of the queue, consuming one of >>> the threads from the thread pool "forever". If you get a bunch of these >>> running at once... GCD is not going to be happy with your train cars >>> sitting on his tracks. >>> >>> Please don't get me wrong. I __LOVE___ all the work that has gone into >>> integrating GCD into MacRuby. But I don't see how GCD is going to help >>> someone implement the cooperative multitasking of Fibers, a Ruby 1.9 >>> language feature. >>> >>> Scott >>> _______________________________________________ >>> MacRuby-devel mailing list >>> MacRuby-devel@lists.macosforge.org >>> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel >> _______________________________________________ >> MacRuby-devel mailing list >> MacRuby-devel@lists.macosforge.org >> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel > > _______________________________________________ > MacRuby-devel mailing list > MacRuby-devel@lists.macosforge.org > http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel