Nikolaus Rath <[EMAIL PROTECTED]> writes: >> This should work, at least the idea is not flawed. However, I'd say >> there are too many locks involved. Rather, you just need a simple >> flag and the global lock. Further, you need a condition/event that >> tells waiting threads that you released some of the files so that it >> should see again if the ones it wants are available. > > I have to agree that this sounds like an easier implementation. I > just have to think about how to do the signalling. Thanks a lot!
Here's the code I use now. I think it's also significantly easier to understand (cv is a threading.Condition() object and cv.locked_keys a set()). def lock_s3key(s3key): cv = self.s3_lock try: # Lock set of locked s3 keys (global lock) cv.acquire() # Wait for given s3 key becoming unused while s3key in cv.locked_keys: cv.wait() # Mark it as used (local lock) cv.locked_keys.add(s3key) finally: # Release global lock cv.release() def unlock_s3key(s3key): cv = self.s3_lock try: # Lock set of locked s3 keys (global lock) cv.acquire() # Mark key as free (release local lock) cv.locked_keys.remove(s3key) # Notify other threads cv.notify() finally: # Release global lock cv.release() Best, -Nikolaus -- »It is not worth an intelligent man's time to be in the majority. By definition, there are already enough people to do that.« -J.H. Hardy PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C -- http://mail.python.org/mailman/listinfo/python-list