import threading
from Queue import Queue
# Set up a queue for tasks to be run on the main thread.
# Most UI toolkits as glib contains functions to push task this way.
Q = Queue()
def idle_add(a,b):
Q.put((a,b))
def async_int(gen):
try: gen.next()
except StopIteration: return
def do():
try: gen.next()
except StopIteration: return
idle_add(async_int, gen)
threading.Thread(target=do).start()
def async(func):
return lambda *a,**kw: async_int(func(*a,**kw))
@async
def test():
# We start in the main thread
print "1 %s" % threading.currentThread()
yield
# This part is run in a seperate thread, not blocking the main thread
print "2 %s" % threading.currentThread()
yield
# Now we are back in the main thread
print "3 %s" % threading.currentThread()
yield
# And in another background thread
print "4 %s" % threading.currentThread()
yield
# And we keep all internal variables between the threads!
print "5 %s" % threading.currentThread()
if __name__ == "__main__":
test()
while True:
a,b = Q.get()
a(b)