Am Samstag, 2. April 2005 22:28 schrieb Paul Rubin:
> I'm starting to believe the GIL covers up an awful lot of sloppiness
> in Python.  I wonder if there could be a decorator approach:
>
>     @synchronized
>     def counter():
>        t = itertools.count()
>        while True:
>          yield t.next()

Of course there could:

def synchronized_iterator(f):
    def wrapper(*args,**kwargs):
        class iterator(object):
            def __init__(self,f,args,kwargs):
                self.iter = f(*args,**kwargs)
                self.lock = threading.RLock()
            def __iter__(self):
                return self
            def next(self):
                self.lock.acquire()
                try:
                    return self.iter.next()
                finally:
                    self.lock.release()
        return iterator(f,args,kwargs)
    return wrapper

@synchronized_iterator
def create_counter():
    t = itertools.count()
    while True:
        yield t.next()

or

counter = synchronized_iterator(itertools.count)

I used a class-based approach, as I don't want to destroy the semantics of 
calling the returned wrapper(), which should've already instantiated the 
wrapped generator object (which doesn't happen when making wrapper() a 
generator itself).

-- 
--- Heiko.

Attachment: pgp4kxA2GZNHL.pgp
Description: PGP signature

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to