title: chaining coroutines in asyncio (and observer pattern)
body: <p>I'm having trouble wrapping my head around how coroutines are chained together. In a slightly less trivial example than hello world or factorials, I'd like to have a loop which continually watches file modification times, and then prints out the time whenever the file is touched:</p>
  
  <pre><code>#!/usr/bin/env python3
  import os
  import asyncio
  
  @asyncio.coroutine
  def pathmonitor(path):
      modtime = os.path.getmtime(path)
      while True:
          new_time = os.path.getmtime(path)
          if new_time != modtime:
              modtime = new_time
              yield modtime
          yield from asyncio.sleep(1)
  
  @asyncio.coroutine
  def printer():
      while True:
          modtime = yield from pathmonitor('/home/users/gnr/tempfile')
          print(modtime)
  
  loop = asyncio.get_event_loop()
  loop.run_until_complete(printer())
  loop.run_forever()
  </code></pre>
  
  <p>I would expect this to work - however, when I run it I get a:</p>
  
  <pre><code>RuntimeError: Task got bad yield: 1426449327.2590399
  </code></pre>
  
  <p>What am i doing wrong here?</p>
  
  <p>UPDATE: see my answer below for an example of the observer pattern (i.e. efficiently allow multiple registrants to get updates when a file gets touched) without using callbacks (you have to use Tasks).</p>
  
  <p>UPDATE2: there is a better fix for this: 3.5's <code>async for</code> (asynchronous iterators): <a href="https://www.python.org/dev/peps/pep-0492/" rel="nofollow">https://www.python.org/dev/peps/pep-0492/</a></p>