[英]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,然后根據我要啟動特定任務的參數進行操作。
現在這是我的問題:
entry.py
文件中的所有任務的import語句是什么 Celery -A <directory name> worker -l info
命令,為什么? 好的,希望這會有所幫助。 我會按照您的要求相反地答復。
在許多示例中,我看到任務與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.