Celery, Open the door! Part Ⅰ

Celery, Open the door! Part Ⅰ


  1. celery一般启动方式

    • command-line方式

      celery -A <celery实例应用包路径> worker [options]

      该命令会默认自动搜索启动目录下celery.py文件,若没有,则路径需包含具体文件名,如:
      celery -A celery_test.main worker
      即启动celery_test目录下的main.py文件。

    • 程序内启动

      app.worker_main(["-app=celery_app", "--loglevel=info"])
      
  2. celery启动后常见的报错

    [2019-03-04 19:13:17,567: ERROR/MainProcess] Received unregistered task of type 'celery_test1.test'.
    The message has been ignored and discarded.
    
    Did you remember to import the module containing this task?
    Or maybe you're using relative imports?
    
    Please see
    http://docs.celeryq.org/en/latest/internals/protocol.html
    for more information.
    
    The full contents of the message body was:
    b'[[], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (77b)
    Traceback (most recent call last):
    File "c:", line 558, in on_task_received
    strategy = strategies[type_]
    KeyError: 'celery_test1.test'
    

    解决方法:不要将异步任务函数的定义和调用写到同一个文件中。

    (该错误常常出现在task未注册的情况下)

  3. celery中的任务注册

    • 使用include参数

      app = Celery("test", include=["base_task.tasks"])
      
    • autodiscover_tasks方法

      app.autodiscover_tasks([".baseTask"], related_name="tasks")`
      

      autodiscover_tasks会自动注册制定目录下related_name文件中的被@app.tasks@shared_tasks所装饰的tasks

    • 在tasks所在目录启动

      celery -A celery_test.baseTask.tasks worker -l info

    • celery会根据注册task时设定的name去找到对应的task,如果在celery运行过程中改变name,则task不能被成功执行。

  4. celery中定时任务的设置

    • celery beat方式

      • setup_periodic_tasks

        @app.on_after_configure.connect
        def setup_periodic_tasks(sender, **kwargs):
            # Calls test('hello') every 10 seconds.
            sender.add_periodic_task(10.0, test.s("hello"), name='test every 10')
            # 可使用crontab实现更复杂的定时任务
        
      • app setting

        app.conf.beat_schedule = {
            'add-every-30-seconds': {
                'task': 'tasks.add',
                'schedule': 30.0,
                'args': (16, 16)
            },
        }
        
      • 启动beat

        celery -A proj beat [options]

    • python第三方库BlockingScheduler

      def schedule_test():
          scheduler = BlockingScheduler()
          scheduler.add_job(job, "interval", seconds=10)
          scheduler.start()
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值