У меня есть многопоточное приложение python. Я хочу запустить цикл asyncio в потоке, а затем отправить кавычки и сопрограммы к нему из другого потока. Должно быть легко, но я не могу окунуться в вещи asyncio.python 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, но должен быть более простой способ, разве это не так?
Спасибо, например, это помогло мне исправить несколько вопросов, которые у меня были. Кстати, я также должен был инициировать Future with Future (loop = self.loop), иначе в некоторых случаях будущее будет принимать неправильный цикл –
@OlivierRD Вы должны использовать 'concurrent.futures.Future', а не' asyncio.Future'. 'concurrent.futures.Future' не принимает ключевое слово' loop'. – dano
Документация, похоже, говорит, что она: https://docs.python.org/3/library/asyncio-task.html#asyncio.Future –