celery run async await (celery运行async函数)

需要:有一个函数用了async def语法,现在需要放入celery运行,这个函数用了aioredis和tortoise-orm,改回同步方法的话,工作量很大,如果能直接在celery中运行它,那就简单很多。解决方案如下:

import asyncio
from celery import Celery


app = Celery(__name__)


def run_async(coro):
    return asyncio.run(coro)


@app.task
def do_sth(*args, **kwargs):
    return run_async(_do_sth(*args, **kwargs))
    # 注:一个task里面只能运行一次run_async


async def _do_sth(*args, **kwargs):
    await sub_task()
    return 'done.'

async def sub_task():
    ...



# Call task
def demo_to_call_task():
    args, kwargs = (), {}
    task = do_sth.delay(*args, **kwargs)
    return {'task_id': task.id}

Note: Celery官方要到5.0才支持asyncio

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Celery的apply_async()方法是用于处理异步任务的常见API。通过调用apply_async()方法,可以将任务丢给Celery,让一个进程去执行任务。这个方法的逻辑是创建一个Celery任务,然后在任务执行之前再次调用apply_async()方法,指定下次执行的定时时间。这样就会产生一个定时的Celery worker。任务执行时,会处理相应的业务逻辑。当达到定时时间时,定时的Celery worker开始执行,然后循环回到第一步。\[1\]\[3\] 然而,有时候在使用apply_async()接口时可能会出现问题。比如,任务可能会丢失,就像将一个石头丢进了大海里一样,消失了。这可能是因为在使用异步调用时出现了故障,而同步调用则没有问题。对于这种情况,需要仔细检查代码和配置,确保正确地使用apply_async()方法,并且没有其他错误导致任务丢失。\[2\] #### 引用[.reference_title] - *1* [celery apply_async定时任务重复执行问题](https://blog.csdn.net/qq_21918903/article/details/126663161)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Celery的apply_async()无法正常工作的解决方案之一](https://blog.csdn.net/inter_peng/article/details/104706810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值