Менеджер асинхронных задач с выборочным порядком возврата - PullRequest
0 голосов
/ 21 января 2020

Я использую python 3.6, и я создал этот класс для обработки асинхронной задачи, возвращая задачу с самым высоким текущим приоритетом и останавливая оставшиеся.

class AsyncTasks:
    """Execute asynchronous tasks with selective return method"""

    @staticmethod
    def schedule(*aws):
        return [asyncio.ensure_future(task) for task in aws]

    @classmethod
    async def quickexit(cls, validator, *aws):
        tasks = cls.schedule(*aws)
        for task in tasks:
            result = await task
            if validator(result):
                break
        [task_.cancel() for task_ in tasks]
        return result

Где aws - это список асинхронных задач и порядок приоритетов задается порядком списка, validator - это функция, которая проверяет, были ли задачи успешными или нет.

Первый : Это правильный способ сделать это?

Второй : Этот код проходит мои тесты и работает асинхронно, но если изменить schedule метод для

    @staticmethod
    def schedule(*aws):
        return (asyncio.ensure_future(task) for task in aws)

т.е. возвращение генератора вместо списка, поведение меняется на синхронный режим и все задачи выполняются последовательно !!. Я был очень удивлен, и я хочу знать, что происходит !!

...