Как сочетать сельдерей с ввода-вывода?


Как я могу создать оболочку, которая делает задачи сельдерея похожими на asyncio.Task? Или есть лучший способ интегрировать сельдерей с asyncio?

@asksol, создатель сельдерея, сказал это::

Довольно часто сельдерей используется в качестве распределенного слоя поверх асинхронных фреймворков ввода-вывода (верхний совет: маршрутизация задач, связанных с ЦП, к работнику prefork означает, что они не будут блокировать ваш цикл событий).

Но я не смог найти никаких примеров кода специально для asyncio фреймворка.

2 18

2 ответа:

Это будет возможно с версии сельдерея 5.0, как указано на официальном сайте:

Http://docs.celeryproject.org/en/4.0/whatsnew-4.0.html#preface

  1. следующая основная версия Celery будет поддерживать только Python 3.5, если мы планируем воспользоваться новой библиотекой asyncio.
  2. отказ от поддержки Python 2 позволит нам удалить огромное количество кода совместимости, а переход на Python 3.5 позволит нам воспользоваться преимуществами набора текста, async / await, asyncio и подобные концепции, которым нет альтернативы в более старых версиях.

все вышесказанное цитировалось по предыдущей ссылке.

Поэтому лучше всего дождаться распространения версии 5.0!

В то же время, счастливое кодирование :)

Вы можете обернуть любой блокирующий вызов в задачу, используя run_in_executor , как описано в документации , я также добавил в Примере пользовательский timeout:

def run_async_task(
    target,
    *args,
    timeout = 60,
    **keywords
) -> Future:
    loop = asyncio.get_event_loop()
    return asyncio.wait_for(
        loop.run_in_executor(
            executor,
            functools.partial(target, *args, **keywords)
        ),
        timeout=timeout,
        loop=loop
    )
loop = asyncio.get_event_loop()
async_result = loop.run_until_complete(
    run_async_task, your_task.delay, some_arg, some_karg="" 
)
result = loop.run_until_complete(
    run_async_task, async_result.result 
)