import time class memcached_queue_context(): "A context manager for queuing operations per key via memcached" poll_interval = 0.005 # in seconds def __init__(self, memcache_client, key_base): self.mc = memcache_client self.key_base = key_base self.queue_push_key = self.key_base + "-push" self.queue_wait_key = self.key_base + "-wait" def __enter__(self): # initialize the queues if needed self.mc.add(self.queue_push_key, '1') self.mc.add(self.queue_wait_key, '1') # take a number index = self.mc.incr(self.queue_push_key) - 1 # poll the queue until your number comes up while True: idx = int(self.mc.get(self.queue_wait_key)) # int() is critical!!! if not idx < index: break time.sleep(self.poll_interval) return def __exit__(self, exc_type, exc_val, exc_tb): # advance the queue self.mc.incr(self.queue_wait_key) return False