title: Python - Cancel task in asyncio?
body: <p>I have written code for async pool below. in <code>__aexit__</code> i'm cancelling the _worker tasks after the tasks get finished. But when i run the code, the worker tasks are not getting cancelled and the code is running forever. This what the task looks like: <code>&lt;Task pending coro=&lt;AsyncPool._worker() running at \async_pool.py:17&gt; wait_for=&lt;Future cancelled&gt;&gt;</code>. The <code>asyncio.wait_for</code> is getting cancelled but not the worker tasks.</p>
  <pre><code>class AsyncPool:
      def __init__(self,coroutine,no_of_workers,timeout):
          self._loop           = asyncio.get_event_loop()
          self._queue          = asyncio.Queue()
          self._no_of_workers  = no_of_workers
          self._coroutine      = coroutine
          self._timeout        = timeout
          self._workers        = None
  
      async def _worker(self): 
          while True:
              try:
                  ret = False
                  queue_item           = await self._queue.get()
                  ret = True
                  result               = await asyncio.wait_for(self._coroutine(queue_item), timeout = self._timeout,loop= self._loop)
              except Exception as e:
                  print(e)
              finally:
                  if ret:
                      self._queue.task_done()
  
  
      async def push_to_queue(self,item):
          self._queue.put_nowait(item)
      
      async def __aenter__(self):
          assert self._workers == None
          self._workers = [asyncio.create_task(self._worker()) for _ in range(self._no_of_workers)]
          return self
      
      async def __aexit__(self,type,value,traceback):
          await self._queue.join()
  
          for worker in self._workers:
              worker.cancel()
  
          await asyncio.gather(*self._workers, loop=self._loop, return_exceptions =True)
  </code></pre>
  <p>To use the Asyncpool:</p>
  <pre><code>async def something(item):
      print(&quot;got&quot;, item)
      await asyncio.sleep(item)
   
  async def main():
      async with AsyncPool(something, 5, 2) as pool:
          for i in range(10):
              await pool.push_to_queue(i)
   
  asyncio.run(main())
  </code></pre>
  <p>The Output in my terminal:
  <a href="https://i.stack.imgur.com/J8ZpR.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/J8ZpR.png" alt="enter image description here" /></a></p>