Как сочетать сельдерей с ввода-вывода?
Как я могу создать оболочку, которая делает задачи сельдерея похожими на asyncio.Task
? Или есть лучший способ интегрировать сельдерей с asyncio
?
@asksol, создатель сельдерея, сказал это::
Довольно часто сельдерей используется в качестве распределенного слоя поверх асинхронных фреймворков ввода-вывода (верхний совет: маршрутизация задач, связанных с ЦП, к работнику prefork означает, что они не будут блокировать ваш цикл событий).
Но я не смог найти никаких примеров кода специально для asyncio
фреймворка.
2 ответа:
Это будет возможно с версии сельдерея 5.0, как указано на официальном сайте:
Http://docs.celeryproject.org/en/4.0/whatsnew-4.0.html#preface
- следующая основная версия Celery будет поддерживать только Python 3.5, если мы планируем воспользоваться новой библиотекой asyncio.
- отказ от поддержки 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 )