title: Does await always give other tasks a chance to execute?
body: <p>I'd like to know what guarantees python gives around when a event loop will switch tasks.</p>
  
  <p>As I understand it <code>async</code> / <code>await</code> are significantly different from   threads in that the event loop does not switch task based on time slicing, meaning that unless the task yields (<code>await</code>), it will carry on indefinitely.  This can actually be useful because it is easier to manage critical sections under asyncio than with threading.</p>
  
  <p>What I'm less clear about is something like the following:</p>
  
  <pre class="lang-py prettyprint-override"><code>async def caller():
      while True:
          await callee()
  
  
  async def callee():
      pass
  </code></pre>
  
  <p>In this example <code>caller</code> is repeatedly <code>await</code>.  So technically it is yielding.  But I'm not clear on whether this will allow other tasks on the event loop to execute because it only yields to <code>callee</code> and that is never yielding.</p>
  
  <p>That is if I awaited <code>callee</code> inside a "critical section" even though I know it won't block, am I at risk of something else unexpected happening?</p>