Comment combiner céleri et asyncio?

Comment puis-je créer un emballage qui fait ressembler les tâches de céleri à asyncio.Task? Ou est-il une meilleure façon d'intégrer le Céleri avec asyncio?

@asksol, le créateur du céleri, dit::

il est assez courant d'utiliser du céleri comme couche distribuée au-dessus des cadres d'entrée/sortie asynchrone (Conseil supérieur: router les tâches liées au CPU à un travailleur de prefork signifie qu'ils ne bloqueront pas votre boucle d'événement).

mais je n'ai pu trouver aucun exemple de code spécifiquement pour asyncio cadre.

18
demandé sur max 2016-10-02 12:51:23

2 réponses

Qui sera possible à partir de Céleri version 5.0 comme l'indique le site officiel:

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

  1. la prochaine version majeure de Celery ne prendra en charge Python 3.5 que si nous prévoyons de profiter de la nouvelle bibliothèque asyncio.
  2. supprimer le support pour Python 2 nous permettra de supprimer des quantités massives de code de compatibilité, et aller avec Python 3.5 nous permet pour profiter de la dactylographie, async / wait, asyncio, et des concepts similaires, il n'y a pas d'alternative pour dans les versions plus anciennes.

ci-dessus, ont été cités à partir du lien précédent.

Donc la meilleure chose à faire est d'attendre version 5.0 pour être distribués!

En attendant, amusez-vous :)

11
répondu John Moutafis 2018-08-05 19:00:23

vous pouvez envelopper n'importe quel appel de blocage dans une tâche en utilisant run_in_executor comme décrit dans documentation, j'ai également ajouté dans l'exemple d'un custom 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 
)
1
répondu danius 2018-02-26 22:39:22