如何构建芹菜任务

pat*_*ide 23 python celery

我有两种类型的任务:异步任务和计划任务.所以,这是我的目录结构:

proj
  |
  -- tasks
      |
      -- __init__.py
      |
      -- celeryapp.py     => celery instance defined in this file.
      |
      -- celeryconfig.py
      |
      -- async
      |    |
      |    -- __init__.py
      |    |
      |    -- task1.py    => from proj.tasks.celeryapp import celery
      |    |
      |    -- task2.py    => from proj.tasks.celeryapp import celery
      |
      -- schedule
           |
           -- __init__.py
           |
           -- task1.py    => from proj.tasks.celeryapp import celery
           |
           -- task2.py    => from proj.tasks.celeryapp import celery
Run Code Online (Sandbox Code Playgroud)

但是,当我像下面这样经营芹菜工人时,它不起作用.它无法接受来自芹菜节拍计划的任务.

 $ celery worker --app=tasks -Q my_queue,default_queue
Run Code Online (Sandbox Code Playgroud)

那么,有多个任务文件组织的最佳实践吗?

小智 8

基于celery 文档,您可以导入芹菜任务的结构,如下所示:

例如,如果你有一个(想象的)目录树,如下所示:

|
|-- foo
|    |-- __init__.py
|    |-- tasks.py
|
|-- bar
     |-- __init__.py
     |-- tasks.py
Run Code Online (Sandbox Code Playgroud)

然后调用app.autodiscover_tasks(['foo', bar'])将导致导入模块foo.tasks和bar.tasks.


xec*_*cgr 5

Celery任务可以是异步,同步或调度取决于其调用

task.delay(arg1,arg2)       #will be async
task.delay(arg1,arg2).get() #will be sync
task.delay(arg1,arg2).get() #will be sync
task.apply_async(args = [arg1,arg2], {'countdown' : some_seconds}) #async with delay
Run Code Online (Sandbox Code Playgroud)

根据您的需要有很多调用
但是,您必须使用-B标志启动芹菜以启用芹菜调度程序

$ celery worker --app=tasks -B -Q my_queue,default_queue
Run Code Online (Sandbox Code Playgroud)

因此,您组织任务的方式是个人的,它取决于您的项目复杂性,但我认为按照同步类型组织它们并不是最佳选择.

我已经搜索了这个主题,我没有找到任何指南或建议,但我已经阅读了一些根据其功能组织任务的案例.
我遵循了这个建议,因为这不是我的项目中的模式.这是我如何做的一个例子

your_app
    |
    -- reports
        |
        -- __init__.py
        -- foo_report.py
        -- bar_report.py
        -- tasks
            |
            -- __init__.py
            -- report_task.py
    -- maintenance
        |
        -- __init__.py
        -- tasks
            |
            -- __init__.py
            -- delete_old_stuff_task.py
    -- twitter
        |
        -- __init__.py
        -- tasks
            |
            -- __init__.py
            -- batch_timeline.py                
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并没有回答任何问题? (2认同)