Python 最强大的任务调度框架 Celery!( 六 )


Python 最强大的任务调度框架 Celery!

文章插图
delay 方法的 *args 和 **kwargs 就是函数的参数 , 它会传递给 apply_async 的 args 和 kwargs 。而其它的参数就是发送任务时所设置的一些参数 , 我们这里重点介绍一下 apply_async 的其它参数 。
 
  •  
    countdown:倒计时 , 表示任务延迟多少秒之后再执行 , 参数为整型;
     
  •  
    eta:任务的开始时间 , datetime 类型 , 如果指定了 countdown , 那么这个参数就不应该再指定;
     
  •  
    expires:datetime 或者整型 , 如果到规定时间、或者未来的多少秒之内 , 任务还没有发送到队列被 worker 执行 , 那么该任务将被丢弃;
     
  •  
    shadow:重新指定任务的名称 , 覆盖 app.py 创建任务时日志上所指定的名字;
     
  •  
    retry:任务失败之后是否重试 , bool 类型;
     
  •  
    retry_policy:重试所采用的策略 , 如果指定这个参数 , 那么 retry 必须要为 True 。参数类型是一个字典 , 里面参数如下:
     
    •  
      max_retries : 最大重试次数 , 默认为 3 次;
       
    •  
      interval_start : 重试等待的时间间隔秒数 , 默认为 0 , 表示直接重试不等待;
       
    •  
      interval_step : 每次重试让重试间隔增加的秒数 , 可以是数字或浮点数 , 默认为 0.2;
       
    •  
      interval_max : 重试间隔最大的秒数 , 即通过 interval_step 增大到多少秒之后, 就不在增加了, 可以是数字或者浮点数;
       
  •  
    routing_key:自定义路由键 , 针对 RabbitMQ;
     
  •  
    queue:指定发送到哪个队列 , 针对 RabbitMQ;
     
  •  
    exchange:指定发送到哪个交换机 , 针对 RabbitMQ;
     
  •  
    priority:任务队列的优先级 , 0-9 之间 , 对于 RabbitMQ 而言 , 0是最高级;
     
  •  
    serializer:任务序列化方法 , 通常不设置;
     
  •  
    compression:压缩方案 , 通常有zlib、bzip2;
     
  •  
    headers:为任务添加额外的消息头;
     
  •  
    link:任务成功执行后的回调方法 , 是一个signature对象 , 可以用作关联任务;
     
  •  
    link_error: 任务失败后的回调方法 , 是一个signature对象;
     
 
我们随便挑几个举例说明:
>>> from app import add
# 使用 apply_async , 要注意参数的传递
# 位置参数使用元组或者列表 , 关键字参数使用字典
# 因为是args和kwargs, 不是 *args和 **kwargs
>>> add.apply_async([3], {"y": 4},
... task_id="恋恋",
... countdown=5).get()

 
7
>>>

查看一下 worker 的输出:
Python 最强大的任务调度框架 Celery!

文章插图
注意左边的时间 , 16:25:16 收到的消息 , 但 5 秒后才执行完毕 , 因为我们将 countdown 参数设置为 5 。并且任务的 id 也被我们修改了 。
另外还需要注意一下那些接收时间的参数 , 比如 eta 。如果我们手动指定了eta , 那么一定要注意时区的问题 , 要保证 celery 所使用的时区和你传递的 datetime 的时区是统一的 。
其它的参数可以自己手动测试一下 , 这里不细说了 , 根据自身的业务选择合适的参数即可 。


推荐阅读