title: Using queues results in asyncio exception "got Future <Future pending> attached to a different loop"
body: <p>I'm trying to run this simple code with asyncio queues, but catch exceptions, and even nested exceptions. </p>
  
  <p>I would like to get some help with making queues in asyncio work correctly:</p>
  
  <pre><code>import asyncio, logging
  
  logging.basicConfig(level=logging.DEBUG)
  logging.getLogger("asyncio").setLevel(logging.WARNING)
  
  
  num_workers = 1
  in_queue = asyncio.Queue()
  out_queue = asyncio.Queue()
  tasks = []
  
  
  async def run():
      for request in range(1):
          await in_queue.put(request)
  
      # each task consumes from 'input_queue' and produces to 'output_queue':
      for i in range(num_workers):
          tasks.append(asyncio.create_task(worker(name=f'worker-{i}')))
      # tasks.append(asyncio.create_task(saver()))
  
      print('waiting for queues...')
      await in_queue.join()
      # await out_queue.join()
      print('all queues done')
  
      for task in tasks:
          task.cancel()
      print('waiting until all tasks cancelled')
      await asyncio.gather(*tasks, return_exceptions=True)
      print('done')
  
  
  async def worker(name):
      while True:
          try:
              print(f"{name} started")
              num = await in_queue.get()
              print(f'{name} got {num}')
              await asyncio.sleep(0)
              # await out_queue.put(num)
          except Exception as e:
              print(f"{name} exception {e}")
          finally:
              print(f"{name} ended")
              in_queue.task_done()
  
  
  async def saver():
      while True:
          try:
              print("saver started")
              num = await out_queue.get()
              print(f'saver got {num}')
              await asyncio.sleep(0)
              print("saver ended")
          except Exception as e:
              print(f"saver exception {e}")
          finally:
              out_queue.task_done()
  
  
  asyncio.run(run(), debug=True)
  print('Done!')
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>waiting for queues...
  worker-0 started
  worker-0 got 0
  worker-0 ended
  worker-0 started
  worker-0 exception 
  worker-0 ended
  ERROR:asyncio:unhandled exception during asyncio.run() shutdown
  task: &lt;Task finished coro=&lt;worker() done, defined at temp4.py:34&gt; exception=ValueError('task_done() called too many times') created at Python37\lib\asyncio\tasks.py:325&gt;
  Traceback (most recent call last):
    File "Python37\lib\asyncio\runners.py", line 43, in run
      return loop.run_until_complete(main)
    File "Python37\lib\asyncio\base_events.py", line 573, in run_until_complete
      return future.result()
    File "temp4.py", line 23, in run
      await in_queue.join()
    File "Python37\lib\asyncio\queues.py", line 216, in join
      await self._finished.wait()
    File "Python37\lib\asyncio\locks.py", line 293, in wait
      await fut
  RuntimeError: Task &lt;Task pending coro=&lt;run() running at temp4.py:23&gt; cb=[_run_until_complete_cb() at Python37\lib\asyncio\base_events.py:158] created at Python37\lib\asyncio\base_events.py:552&gt; got Future &lt;Future pending&gt; attached to a different loop
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "temp4.py", line 46, in worker
      in_queue.task_done()
    File "Python37\lib\asyncio\queues.py", line 202, in task_done
      raise ValueError('task_done() called too many times')
  ValueError: task_done() called too many times
  Traceback (most recent call last):
    File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevd.py", line 1664, in &lt;module&gt;
      main()
    File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevd.py", line 1658, in main
      globals = debugger.run(setup['file'], None, None, is_module)
    File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\pydevd.py", line 1068, in run
      pydev_imports.execfile(file, globals, locals)  # execute the script
    File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.4\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
      exec(compile(contents+"\n", file, 'exec'), glob, loc)
    File "temp4.py", line 63, in &lt;module&gt;
      asyncio.run(run(), debug=True)
    File "Python37\lib\asyncio\runners.py", line 43, in run
      return loop.run_until_complete(main)
    File "Python37\lib\asyncio\base_events.py", line 573, in run_until_complete
      return future.result()
    File "temp4.py", line 23, in run
      await in_queue.join()
    File "Python37\lib\asyncio\queues.py", line 216, in join
      await self._finished.wait()
    File "Python37\lib\asyncio\locks.py", line 293, in wait
      await fut
  RuntimeError: Task &lt;Task pending coro=&lt;run() running at temp4.py:23&gt; cb=[_run_until_complete_cb() at Python37\lib\asyncio\base_events.py:158] created at Python37\lib\asyncio\base_events.py:552&gt; got Future &lt;Future pending&gt; attached to a different loop
  </code></pre>
  
  <p>This is the basic flow, what I would like to do later is run more requests on more workers where each worker will move the number from <code>in_queue</code> to <code>out_queue</code> and then the saver will print the numbers from <code>out_queue</code>.</p>