У меня есть многопоточное приложение python. Я хочу запустить цикл asyncio в потоке, а затем отправить кавычки и сопрограммы к нему из другого потока. Должно быть легко, но я не могу опуститься вокруг asyncio.
Я подошел к следующему решению, которое делает половину того, что я хочу, не стесняйтесь комментировать что-либо:
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()
Таким образом, запуск и остановка цикла работает нормально. Я думал о создании задачи с помощью create_task, но этот метод не является потоковым, поэтому я завернул его в call_soon_threadsafe. Но я хотел бы иметь возможность получить объект задачи, чтобы иметь возможность отменить задачу. Я мог бы сделать сложный материал, используя Future and Condition, но должен быть более простой способ, isnt'it?