title: Why doesn't this async code stop?
body: <p>The following code snippet has two coroutines each for server and client. The client coroutine has a logic to break the <code>while</code> loop after 10 seconds and server should stop after 15 seconds.</p>
  
  <p>When I run the script this doesn't stop, ideally, it should stop after 15 seconds but this is not happening.</p>
  
  <pre><code>import asyncio
  import time
  import zmq
  import zmq.asyncio
  
  zmq.asyncio.install()
  
  ctx = zmq.asyncio.Context()
  
  
  server_socket = ctx.socket(zmq.REP)
  client_socket = ctx.socket(zmq.REQ)
  
  server_socket.bind("tcp://127.0.0.1:8899")
  client_socket.connect("tcp://127.0.0.1:8899")
  
  t0 = time.time()
  
  
  @asyncio.coroutine
  def server_coroutine():
  
      while True:
          msg = yield from server_socket.recv_string()
          print(msg)
          msg = "Server:: {}".format(msg)
          yield from server_socket.send_string(msg)
          t1 = time.time()
          elapsed_time = t1 - t0
          # print('elapsed time is {}'.format(elapsed_time))
          if elapsed_time &gt; 15:
              print("Breaking Server loop")
              break
  
  @asyncio.coroutine
  def client_coroutine():
      counter = 0
      while True:
          yield from asyncio.sleep(2)
          msg = 'Message: {}'.format(counter)
          yield from client_socket.send_string(msg)
          res = yield from client_socket.recv_string()
          print(res)
          t1 = time.time()
          elapsed_time = t1 - t0
          print('elapsed time is {}'.format(elapsed_time))
          if elapsed_time &gt; 10:
              print("Breaking Client loop")
              break
          counter += 1
  
  
  if __name__ == '__main__':
  
      loop = asyncio.get_event_loop()
  
      loop.run_until_complete(asyncio.gather(
          asyncio.ensure_future(server_coroutine()),
          asyncio.ensure_future(client_coroutine())
      ))
  </code></pre>