#!/usr/bin/python

import threading
import time

class Para(object):
    def __init__(self):
        self.c = []

    def add(self, f, args, kwargs):
        self.c.append((f, args, kwargs))

    def __call__(self):
        for f, a, k in self.c:
            threading.Thread(target=lambda: f(*a, **k)).start()

def para(p, *args, **kwargs):
    def with_f(f):
        p.add(f, args, kwargs)
    return with_f

def func():
    p = Para()

    @para(p, 43, 23)
    def add(a, b):
        print 'added: ', a, 'and', b, 'to', (a+b)
        for i in xrange(2000):
            print 20-i, 'x'

    @para(p)
    def do():
        for i in xrange(1000):
            print i
        print 'doing something'

    p()

func()

