 <blockquote> <p>I get mostly 2 calls at the same time (1 for each thread), followed by a one second pause. What is wrong?</p> </blockquote> <p>That's exactly what you should expect from your implementation. Lets say the time <em>t</em> starts at 0 and the rate is 1:</p> <p>Thread1 does this:</p> <pre><code> lock.acquire() # both threads wait here, one gets the lock current_time = time.time() # we start at t=0 interval = current_time - last_time[0] # so interval = 0 last_time[0] = current_time # last_time = t = 0 if interval &lt; rate: # rate = 1 so we sleep time.sleep(rate - interval) # to t=1 lock.release() # now the other thread wakes up # it's t=1 and we do the job </code></pre> <p>Thread2 does this:</p> <pre><code> lock.acquire() # we get the lock at t=1 current_time = time.time() # still t=1 interval = current_time - last_time[0] # interval = 1 last_time[0] = current_time if interval &lt; rate: # interval = rate = 1 so we don't sleep time.sleep(rate - interval) lock.release() # both threads start the work around t=1 </code></pre> <p>My advice is to limit the speed at which the items are <em>put into the queue</em>. </p>