• 【python小随笔】celery异步任务与调用返回值


    s1.py(配置任务文件)

    from celery import Celery
    import time
    
    
    my_task = Celery("tasks", broker="redis://127.0.0.1:6379", backend="redis://127.0.0.1:6379")
    
    # 为应用创建任务,func1
    @my_task.task(name="Celery.celery.s1.func2")  # 指定任务路径(坑)
    def func2(x, y):
        time.sleep(3)
        print("2222222222222222222")
        return x+y

     s2.py(执行异步文件)

    from celery.result import AsyncResult
    
    from Celery.celery.s1 import func2, my_task
    import time
    
    if __name__ == '__main__':
        # 将任务交给Celery的Worker执行
        res = func2.delay(2 ,3)
        # 异步获取任务返回值
        for i in range(100):
            time.sleep(1)
            async_task = AsyncResult(id=res.id ,app=my_task)
            print("async_task.id" ,async_task.id)
            # 判断异步任务是否执行成功
            if async_task.successful():
                # 获取异步任务的返回值
                result = async_task.get()
                print(result)
                print("执行成功")
                break
            else:
                print("任务还未执行完成")

    ##### 以下是相关参数

    @celery.task(bind=True, name='name')
    def function_name():
        pass
    
    # task方法参数
    name:可以显式指定任务的名字;默认是模块的命名空间中本函数的名字。
    serializer:指定本任务的序列化的方法;
    bind:一个bool值,设置是否绑定一个task的实例,如果绑定,task实例会作为参数传递到任务方法中,可以访问task实例的所有的属性,即前面反序列化中那些属性
    base:定义任务的基类,可以以此来定义回调函数,默认是Task类,我们也可以定义自己的Task类
    default_retry_delay:设置该任务重试的延迟时间,当任务执行失败后,会自动重试,单位是秒,默认3分钟;
    autoretry_for:设置在特定异常时重试任务,默认False即不重试;
    retry_backoff:默认False,设置重试时的延迟时间间隔策略;
    retry_backoff_max:设置最大延迟重试时间,默认10分钟,如果失败则不再重试;
    retry_jitter:默认True,即引入抖动,避免重试任务集中执行;
    # 当bind=True时,add函数第一个参数是self,指的是task实例
    @task(bind=True)  # 第一个参数是self,使用self.request访问相关的属性
    def add(self, x, y):
        try:
            logger.info(self.request.id)
        except:
            self.retry() # 当任务失败则进行重试
    import celery
    
    class MyTask(celery.Task):
        # 任务失败时执行
        def on_failure(self, exc, task_id, args, kwargs, einfo):
            print('{0!r} failed: {1!r}'.format(task_id, exc))
        # 任务成功时执行
        def on_success(self, retval, task_id, args, kwargs):
            pass
        # 任务重试时执行
        def on_retry(self, exc, task_id, args, kwargs, einfo):
            pass
    
    @task(base=MyTask)
    def add(x, y):
        raise KeyError()
    
    #方法相关的参数
    exc:失败时的错误的类型;
    task_id:任务的id;
    args:任务函数的参数;
    kwargs:键值对参数;
    einfo:失败或重试时的异常详细信息;
    retval:任务成功执行的返回值;

    4:TASK的一般属性:

    Task.name:任务名称;
    Task.request:当前任务的信息;
    Task.max_retries:设置重试的最大次数
    Task.throws:预期错误类的可选元组,不应被视为实际错误,而是结果失败;
    Task.rate_limit:设置此任务类型的速率限制
    Task.time_limit:此任务的硬限时(以秒为单位)。
    Task.ignore_result:不存储任务状态。默认False;
    Task.store_errors_even_if_ignored:如果True,即使任务配置为忽略结果,也会存储错误。
    Task.serializer:标识要使用的默认序列化方法的字符串。
    Task.compression:标识要使用的默认压缩方案的字符串。默认为task_compression设置。
    Task.backend:指定该任务的结果存储后端用于此任务。
    Task.acks_late:如果设置True为此任务的消息将在任务执行后确认 ,而不是在执行任务之前(默认行为),即默认任务执行之前就会发送确认;
    Task.track_started:如果True任务在工作人员执行任务时将其状态报告为“已启动”。默认是False;

    获取任务结果和状态:

    r = task.apply_async()
    r.ready()     # 查看任务状态,返回布尔值,  任务执行完成, 返回 True, 否则返回 False.
    r.wait()      # 会阻塞等待任务完成, 返回任务执行结果,很少使用;
    r.get(timeout=1)       # 获取任务执行结果,可以设置等待时间,如果超时但任务未完成返回None;
    r.result      # 任务执行结果,未完成返回None;
    r.state       # PENDING, START, SUCCESS,任务当前的状态
    r.status      # PENDING, START, SUCCESS,任务当前的状态
    r.successful  # 任务成功返回true
    r.traceback  # 如果任务抛出了一个异常,可以获取原始的回溯信息

    自定义发布者,交换机,路由键, 队列, 优先级,序列方案和压缩方法:

    task.apply_async((2,2), 
        compression='zlib',
        serialize='json',
        queue='priority.high',
        routing_key='web.add',
        priority=0,
        exchange='web_exchange')
  • 相关阅读:
    Linux下查看使用的是哪种shell的方法汇总【转】
    Shell中的while循环【转】
    shell浅谈之三for、while、until循环【转】
    cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】
    Linux makefile 教程 非常详细,且易懂【转】
    链表常见的问题【转】
    linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】
    linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
    关于hrtimer_forward小段代码的分析【转】
    CTP多点触摸协议【转】
  • 原文地址:https://www.cnblogs.com/wanghong1994/p/12144548.html
Copyright © 2020-2023  润新知