Задать вопрос
@vitalysokolov

Правильно ли я управляю задачами в asyncio?

Задача: пишу парсер (python 3.9), нужно запускать метод make_attempt() и в зависимости от результата его выполнения запускать дополнительные задачи, работающие параллельно.
Правильно ли я сделал реализацию?
В точке входа (метод run()) я создаю первую задачу, добавляю её в общий лист задач
self.data["worker"]["tasks"]
и запускаю
await asyncio.gather(*self.data["worker"]["tasks"])


В методе make_attempt() я жду результат запроса к серверу (использую клиент aiohttp) и, в зависимости от результата, либо добавляю новые задачи, которые должны быть выполнены параллельно и асинхронно, либо повторяю make_attempt().
Т.е. в методе make_attempt() я останавливаю текущую задачу и удаляю её из листа с задачами и далее добавляю новые задачи.

async def make_attempt(self):
    attempt: int = self.data["res"]["attempt"]

    await self.do_something()
    await sleep(1)

    for task in self.data["worker"]["tasks"]:
        print("Task name: %s" % task.get_name())
        if task.get_name() == str(attempt):
            task.cancel()
    self.data["worker"]["tasks"] = [task for task in self.data["worker"]["tasks"] if task.get_name() != str(attempt)]

    if 1 > 0:  # a condition to start make_attempt() again
        self.data["worker"]["tasks"].append(asyncio.create_task(self.make_attempt(), name=attempt))
        await asyncio.gather(*self.data["worker"]["tasks"])

async def run(self):
    self.data["worker"]["tasks"].append(asyncio.create_task(self.make_attempt(), name=self.data["res"]["attempt"]))
    await asyncio.gather(*self.data["worker"]["tasks"])
  • Вопрос задан
  • 69 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы