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.
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
- 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.
- 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 :)
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
)