Задача: пишу парсер (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"])