Celery 任务未被处理
我正在尝试使用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.log
和worker1.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
的权限,让两个用户都能读取这个文件,解决了这个问题。