python使用celery-group优化大数据处理速度

celery-group的使用

配置

  • 为子任务配置独立的celery进程

    from kombu import Exchange, Queue
    default_exchange = Exchange('default', type='direct')
    concurrency_exchange = Exchange('concurrency', type='direct')
    
    app.conf.task_queues = (
        Queue('default', default_exchange, routing_key='default'),
        Queue('concurrency', concurrency_exchange, routing_key='concurrency'),
    )
    app.conf.task_default_queue = 'default'
    app.conf.task_default_exchange = 'default'
    app.conf.task_default_routing_key = 'default'
    

使用

  • 在异步任务中使用指定的进程,分割出多个子任务

    from celery import group
    from celery.result import allow_join_result
    a = [1, 2, 3, 4]
    
    @app.task(bind=True, queue='concurrency')
    def add(a):
        if len(a) > 1:
            g1 = add2.s(a[0:int(len(a) / 2)])
            g2 = add2.s(a[int(len(a) / 2):])
            g = group([g1, g2])
            res = g.apply_async()
            if result.ready():  # 是否执行完毕
                if result.successful():  # 是否所有子任务都成功了
                    with allow_join_result():
                        r = res.get()    # 获取所有值, 返回值为一个列表  [[1, 2], [3, 4]]
    
    
    @app.task(bind=True, queue='concurrency')
    def add2(a):
        return a
    
  • g.apply_async()支持操作

    命令说明
    successful()返回True如果全部顺利完成子任务(例如,没有提出一个例外)。
    failed()True如果任何子任务失败,则返回。
    waiting()True如果任何子任务尚未准备就绪,则返回。
    ready()True如果所有子任务都准备就绪,则返回。
    completed_count()返回完成的子任务数。
    revoke()撤消所有子任务。
    join()收集所有子任务的结果,并以与调用它们相同的顺序(作为列表)返回它们。

需要注意的问题

异步数据量达到上限

  • celery-task的result默认类型为BLOB, 而blob类型最大能容纳65KB的数据, 异步任务的数据量过大时会导致异步任务报错

    # 返回的数据自动被截取
    Warning: (1265, "Data truncated for column 'result' at row 1")
    # 数据不完整导致解析报错
    EOFError('Ran out of input',)
    
  • 所以使用celery进程的时候尽量在独立的进程中处理完数据,不要让返回值超出范围


参考链接:python使用celery-group优化大数据处理速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光不写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值