Skip Montanaro wrote:
    Paul> I'd like to have a function (or other callable object) that
    Paul> returns 0, 1, 2, etc. on repeated calls.
    ...
    Paul> There should never be any possibility of any number getting
    Paul> returned twice, or getting skipped over, even if f is being called
    Paul> from multiple threads.

How about (untested):

    import Queue

    counter = Queue.Queue()
    counter.put(0)
    def f():
        i = counter.get()
I think you need:
          i = counter.get(True)
for this to work; otherwise a race condition would raise an exception.
        counter.put(i+1)
        return i

[snip]

This is, of course dependent upon counter.get() being guaranteed to be thread safe. (I haven't found anything in the docs specifically relating to that. Perhaps it's implicit?)

Thanks,
--ag

--
Artie Gold -- Austin, Texas
http://it-matters.blogspot.com (new post 12/5)
http://www.cafepress.com/goldsays
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to