Friday, November 16, 2007

Cooperative + Preemptive Concurrency

I've just uploaded Fibra 2 to the cheeseshop. Fibra 2 includes the promised non-blocking plugin, which allows a generator based task to momentarily run in a seperate thread.
import fibra
import fibra.plugins.nonblock
import fibra.plugins.sleep
import time


def stuff():
yield fibra.plugins.nonblock.WillBlock()
print 'I am running inside a thread.'
time.sleep(2)
print 'I am still running inside a thread.'
time.sleep(1)
print 'I am exiting the thread, going back into cooperative mode.'
yield None
for i in xrange(3):
print 'I am running cooperatively too.'
yield 1

def other_stuff():
for i in xrange(5):
print 'I am running cooperatively.'
yield 1


s = fibra.Schedule()
s.register_plugin(fibra.plugins.sleep.SleepPlugin())
s.register_plugin(fibra.plugins.nonblock.NonBlockPlugin())
s.install(stuff())
s.install(other_stuff())
while s.tick(): pass

5 comments:

Anonymous said...

Is this more similar to Erlang or stackless?

Simon Wittber said...

I haven't used Erlang, and have only had a cursory glance over stackless, so I can't really answer that question.

However, I can say that I have been inspired what I've read about these other technologies.

Sergey said...

The Home Page link on Cheeseshop is dead unfortunately.

Simon Wittber said...

Oops. Fixed.

Anonymous said...

The "Fibra 2" link at the top of this page is broken. It links to http://cheeseshop.python.org/pypi/fibra/2, which says "Not Found".

Popular Posts