Celery任务在无限循环中重新处理自身

时间:2017-06-26 18:43:34

标签: python celery

我遇到了一个奇怪的情况,芹菜会重新处理已经完成的任务。整体设计如下:

Celery Beat:定期提取文件,如果提取了文件,它会在数据库中创建一个新条目,并将该文件的处理委托给1个工作队列中的另一个芹菜任务(这样一次只能处理1个文件)

Celery任务:处理文件,一旦完成,没有重试,没有循环。

@app.task(name='periodic_pull_file')
def periodic_pull_file():
    for f in get_files_from_some_dir(...):
        ingested_file = IngestedFile(filename=filename)
        ingested_file.document.save(filename, File(f))
        ingested_file.save()
        process_import(ingested_file.id)
        #deletes the file from the dir source
        os.remove(....somepath)

def process_import(ingested_file_id):
    ingested_file = IngestedFile.objects.get(id=ingested_file_id)
    if 'foo' in ingested_file.filename.lower():
        f = process_foo
    else:
        f = process_real_stuff
    f.apply_async(args=[ingested_file_id], queue='import')

@app.task(name='process_real_stuff')
def process_real_stuff(file_id):
    #dostuff

process_foo和process_real_stuff只是一个循环遍历文件的函数,一旦完成它就完成了。我实际上可以跟踪它的位置百分比以及我注意到的有趣的事情是同一个文件不断被反复处理(请注意,这些文件很大并且处理速度很慢,需要几个小时才能处理。现在我开始了想知道它是否只是在队列中创建了重复的任务。当我有13个要导入的待处理文件时,我检查了我的redis队列:

-bash-4.1$ redis-cli -p 6380 llen import
(integer) 13

aha,13,我检查了每个排队任务的内容,看看是否只是使用以下方法重复了ingested_file_ids:

redis-cli -p 6380 lrange import 0 -1

它们都是具有唯一ingested_file_id的独特任务。我忽略了什么吗?是否有任何理由完成任务 - >一遍又一遍地循环同一个任务?这种情况最近才开始发生,没有代码更改。之前的事情是相当活泼和无缝的。我知道它也不是来自一个“失败”的过程,它以某种方式神奇地重演,因为它没有在队列中向下移动。即它一次又一次地以相同的顺序接收相同的任务,所以它永远不会触及它应该处理的其他13个文件。

注意,这是我的工作人员:

python manage.py celery worker -A myapp -l info -c 1 -Q import

1 个答案:

答案 0 :(得分:0)

使用这个

<块引用>

celery -Q your_queue_name 清除