title: python asyncio, how to create and cancel tasks from another thread
body: <p>I have a python multi-threaded application. I want to run an asyncio loop in a thread and post calbacks and coroutines to it from another thread. Should be easy but I cannot get my head around the <a href="https://docs.python.org/3.4/library/asyncio.html" rel="noreferrer">asyncio</a> stuff.</p>
  
  <p>I came up to the following solution which does half of what I want, feel free to comment on anything:</p>
  
  <pre><code>import asyncio
  from threading import Thread
  
  class B(Thread):
      def __init__(self):
          Thread.__init__(self)
          self.loop = None
  
      def run(self):
          self.loop = asyncio.new_event_loop()
          asyncio.set_event_loop(self.loop) #why do I need that??
          self.loop.run_forever()
  
      def stop(self):
          self.loop.call_soon_threadsafe(self.loop.stop)
  
      def add_task(self, coro):
          """this method should return a task object, that I
            can cancel, not a handle"""
          f = functools.partial(self.loop.create_task, coro)
          return self.loop.call_soon_threadsafe(f)
  
      def cancel_task(self, xx):
          #no idea
  
  @asyncio.coroutine
  def test():
      while True:
          print("running")
          yield from asyncio.sleep(1)
  
  b.start()
  time.sleep(1) #need to wait for loop to start
  t = b.add_task(test())
  time.sleep(10)
  #here the program runs fine but how can I cancel the task?
  
  b.stop()
  </code></pre>
  
  <p>So starting and stoping the loop works fine. I thought about creating task using create_task, but that method is not threadsafe so I wrapped it in call_soon_threadsafe. But I would like to be able to get the task object in order to be able to cancel the task. I could do a complicated stuff using Future and Condition, but there must be a simplier way, isnt'it?</p>