Celery 任务未被处理

7 投票
1 回答
9128 浏览
提问于 2025-04-18 02:46

我正在尝试使用celery来处理一些任务,但运气不太好。我把celeryd和celerybeat当作后台程序在运行。我有一个叫做tasks.py的文件,里面定义了一个简单的应用和任务,内容如下:

from celery import Celery

app = Celery('tasks', broker='amqp://user:pass@hostname:5672/vhostname')

@app.task
def process_file(f):
    # do some stuff
    # and log results

这个文件在另一个文件process.py中被引用,我用这个文件来监控文件的变化,内容如下:

from tasks import process_file

file_name = '/file/to/process'
result = process_file.delay(file_name)
result.get()

但是,就这段小代码,celery却无法看到任务并处理它们。我可以在python解释器中执行类似的代码,celery能够处理这些任务:

py >>> from tasks import process_file
py >>> process_file.delay('/file/to/process')
<AsyncResult: 8af23a4e-3f26-469c-8eee-e646b9d28c7b>

不过,当我从解释器运行任务时,beat.logworker1.log并没有显示任务被接收的任何信息,但我通过logging确认了任务代码确实被执行了。而且在.log文件中也没有明显的错误。你们觉得这可能是什么原因呢?

我的/etc/default/celerybeat文件内容是:

CELERY_BIN="/usr/local/bin/celery"
CELERYBEAT_CHDIR="/opt/dirwithpyfiles"
CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule"

/etc/default/celeryd的内容是:

CELERYD_NODES="worker1"
CELERY_BIN="/usr/local/bin/celery"
CELERYD_CHDIR="/opt/dirwithpyfiles"
CELERYD_OPTS="--time-limit=300 --concurrency=8"
CELERYD_USER="celery"
CELERYD_GROUP="celery"
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"
CELERY_CREATE_DIRS=1

1 个回答

7

我发现我的问题是通过命令行运行celery,而不是作为后台进程,这样我能看到更详细的错误信息。我是这样做的:

user@hostname   /opt/dirwithpyfiles $ su celery
celery@hostname /opt/dirwithpyfiles $ celery -A tasks worker --loglevel=info

在这里,我发现出现了权限问题,因为以celery用户运行时出现了问题,而当我以普通用户在Python解释器中运行命令时就没有这个问题。我通过更改/file/to/process的权限,让两个用户都能读取这个文件,解决了这个问题。

撰写回答