簡體   English   中英

芹菜工人從哪個目錄開始

[英]Celery worker which directory to start from

我需要有關芹菜工人的幫助。 我尤其無法理解celery worker命令需要從何處(哪個目錄)執行,其背后的概念是什么,以及有關導入的某些操作。

假設我具有以下目錄結構:

.
├── __init__.py
├── entry.py
├── state1
│   ├── __init__.py
│   ├── family1
│   │   ├── __init__.py
│   │   ├── task1.py
│   │   ├── task2.py
│   │   └── task3.py
│   └── family2
│       ├── __init__.py
│       └── task1.py
└── state2
    ├── __init__.py
    ├── family1
    │   ├── __init__.py
    │   ├── task1.py
    │   └── task2.py
    └── family2
        ├── __init__.py
        ├── task1.py
        └── task2.py

. 根目錄是當前工作目錄,名為project

每個taskn.py(task1.py,task2.py等)都是單獨的任務。 每個任務文件如下所示:

from celery import Celery
from celery.result import AsyncResult
from kombu import Queue

_name_ = "project_x"
celapp=Celery(backend='redis://localhost:6379/0', broker='amqp://a:b@localhost/a_vhost')
CELERY_CONFIG = {
    'CELERY_DEFAULT_QUEUE': 'default',
    'CELERY_QUEUES': (Queue('q1'), Queue('q2'),),
    'CELERY_TASK_SERIALIZER': 'pickle',
    'CELERY_ACCEPT_CONTENT': ['json','pickle']
}

celapp.conf.update(**CELERY_CONFIG)

@celapp.task()
def t1():
    print("starting task")
    time.sleep(5)
    print("Finished task")

以下是entry.py的內容:

import json
from flask_cors import CORS
from flask import Flask, Response, render_template
from flask import request, jsonify, redirect
from functools import wraps
<what would be the import statement to import all the tasks>

_name_ = "project_x"
app     = Flask(_name_)

@app.route("/api1", methods=['POST'])
def api1():
    req = request.jsonify
    if not req:
        return jsonify(success=False, msg="Missing request parameters", code="1")
    else:
        param1 = req.get('p1')
        param2 = req.get('p2')
        tId = startTask()
        return jsonify(success="True", msg="All Good", taskId=tId)


def startTask():
    tId = "abcd123"
    created_task = state1.family1.task1.subtask(queue='q1')
    created_task.delay()
    return tId


if __name__ == '__main__':
    app.run(debug=True, host="192.168.1.7", port="4444")

entry.py是燒瓶應用程序,將從該應用程序中觸發api1,然后根據我要啟動特定任務的參數進行操作。

現在這是我的問題:

  1. 導入entry.py文件中的所有任務的import語句是什么
  2. 我從哪里開始工作。 我的意思是我應該從哪個目錄啟動Celery -A <directory name> worker -l info命令,為什么?
  3. 在許多示例中,我看到任務與CeleryApp文件之間存在明顯的隔離。 有人可以建議一下安排我的任務,芹菜配置等更好的方法嗎,以上兩個問題將如何與這個新提議的結構保持一致?

好的,希望這會有所幫助。 我會按照您的要求相反地答復。

在許多示例中,我看到任務與CeleryApp文件之間存在明顯的隔離。 有人可以建議一下安排我的任務,芹菜配置等更好的方法嗎,以上兩個問題將如何與這個新提議的結構保持一致?

我在添加的代碼片段中看到的第一個問題,即您擁有的每個taskn.py都有自己的celery實例。 您需要在每個taskn.py之間共享此實例。 我建議創建一個celery_app.py

my_app
├── __init__.py
├── entry.py
├── celery_app.py
│   ├── ...

在此文件中,您將創建celery實例

from celery import Celery
from celery.result import AsyncResult
from kombu import Queue

_name_ = "project_x"
celapp=Celery(backend='redis://localhost:6379/0', broker='amqp://a:b@localhost/a_vhost')
CELERY_CONFIG = {
    'CELERY_DEFAULT_QUEUE': 'default',
    'CELERY_QUEUES': (Queue('q1'), Queue('q2'),),
    'CELERY_TASK_SERIALIZER': 'pickle',
    'CELERY_ACCEPT_CONTENT': ['json','pickle']
}

celapp.conf.update(**CELERY_CONFIG)
celery_app.conf.imports = [
    'state1.family1.task1',
    'my_app.state1.family1.task2',  # Or Maybe
    ...
]

然后,您可以在每個taskn.py中導入此實例,並且每個任務都將在同一celery應用程序下注冊

from my_app.celery_app import celapp

@celapp.task()
def t1():
    print("starting task")
    time.sleep(5)
    print("Finished task")

我從哪里開始工作。 我的意思是我應該從哪個目錄啟動Celery -A worker -l info命令,為什么?

然后,您應該輕松地調用Celery -A my_app.celery_app worker -l info因為您的celery實例將位於模塊my_app,子模塊celery_app中。

導入entry.py中的所有任務的import語句是什么

最后,您可以從entry.py import state1.family1.task1 import t1並調用t1.delay()或任何已注冊的任務。

因此,按照@Patricio的建議,似乎確實是導入錯誤。 我的新目錄結構如下所示:

.
├── __init__.py
├── celeryConfig
│   ├── __init__.py
│   └── celeryApp.py
├── entry.py
├── state1
│   ├── __init__.py
│   ├── family1
│   │   ├── __init__.py
│   │   ├── task1.py
│   │   ├── task2.py
│   │   └── task3.py
│   └── family2
│       ├── __init__.py
│       └── task1.py
└── state2
    ├── __init__.py
    ├── family1
    │   ├── __init__.py
    │   ├── task1.py
    │   └── task2.py
    └── family2
        ├── __init__.py
        ├── task1.py
        └── task2.py

celeryConfig/celeryApp.py的內容如下:

from celery import Celery
from celery.result import AsyncResult
from kombu import Queue

_name_ = "project_x"
celapp=Celery(backend='redis://localhost:6379/0', broker='amqp://a:b@localhost/a_vhost', include=['state1.family1.task1'])
CELERY_CONFIG = {
    'CELERY_DEFAULT_QUEUE': 'default',
    'CELERY_QUEUES': (Queue('q1'), Queue('q2'),),
    'CELERY_TASK_SERIALIZER': 'pickle',
    'CELERY_ACCEPT_CONTENT': ['json','pickle']
}

celapp.conf.update(**CELERY_CONFIG)

並且taskn.py的內容類似於:

from celeryConfig.celeryApp import celapp
import time

@celapp.task()
def t1():
    print("starting task")
    time.sleep(5)
    print("Finished task")

entry.py保持原樣,僅作如下更改:

from state1.family1.task1 import t1

現在,當celery啟動為: celery -A celeryConfig.celeryApp worker -l info來自根目錄project celery -A celeryConfig.celeryApp worker -l info ,一切運行正常。 作為上述命令的輸出,我得到的消息是

.
.
.
[tasks]
  . state1.family1.task1.t1

.
.
.

表示芹菜已正確啟動,並且該任務確實已注冊。 因此,現在,為了注冊所有任務,我可以閱讀目錄/目錄並在celeryApp.py動態創建include列表。 (完成后將發布更多有關此信息)

謝謝@Patricio

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM