芹菜实际上是如何执行任务的



我在目录the_files中有一个文本文件,其中包含几行,如下所示

aaaaabbbb cccc--ddddeee ffff
gggjjjkkk eers--kklliii kkll
...

我编写了一个芹菜脚本来操作文本文件中的每一行。

from celery import Celery
import os
app = Celery('tasks', broker='amqp://guest@localhost//')
path = "the_files/"
@app.task
def do_task_txt():
    dir_path = os.listdir(path)
    for file in dir_path:
        if file.endswith(".txt"):
            f = open(path + file, "r")
            for line in f:
                string1 = line[0:14].replace(" ", "")
                string2 = line[16:].replace(" ", "")
            #print string1, string2
            return string1, string2
        f.close()

当我用芹菜运行此脚本时,它提供以下结果

[tasks]
  . tasks.do_task_txt
[2017-03-22 13:51:00,713: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2017-03-22 13:51:00,791: INFO/MainProcess] mingle: searching for neighbors
[2017-03-22 13:51:01,966: INFO/MainProcess] mingle: all alone
[2017-03-22 13:51:02,055: INFO/MainProcess] celery@Ling-Air ready.
[2017-03-22 13:51:25,624: INFO/MainProcess] Received task: tasks.do_task_txt[77166520-21a8-466e-9522-cb2b1821a185]  
[2017-03-22 13:51:26,152: INFO/PoolWorker-2] Task tasks.do_task_txt[77166520-21a8-466e-9522-cb2b1821a185] succeeded in 0.00866508999752s: ('aaaaabbbbcccc', 'ddddeeeffff')

它只显示第一行。

我希望让它为每行显示,也许是这样的?

[2017-03-22 13:51:26,152: INFO/PoolWorker-2] Task tasks.do_task_txt[77166520-21a8-466e-9522-cb2b1821a185] succeeded in 0.00866508999752s: ('aaaaabbbbcccc', 'ddddeeeffff'),('gggjjjkkkeers', 'kklliiikkll'),(.....,...)

我通过调用print string1, string2检查了我的脚本,它确实将结果打印为我所期望的

aaaaabbbbcccc ddddeeeffff
gggjjjkkkeers kklliiikkll
...

我的问题是芹菜如何执行任务?当我执行任务do_task_txt时,它只显示已作的文件中的一个行。如何显示所有已操作的行,而不是仅显示一行?

谢谢你的建议。

在if语句中永远不会调用第一个f.close(),因此文件句柄将保留。

其次,您的任务返回一个元组,而芹菜(或代理(无法正确解析该元组。

而是返回合并的字符串:

return ", ".join(string1, string2)

当你return时,函数执行完成,它不会处理左行和其他文件。您应该保存结果并最终返回。

@app.task
def do_task_txt():
    dir_path = os.listdir(path)
    result = []
    for file in dir_path:
        if file.endswith(".txt"):
            f = open(path + file, "r")
            for line in f:
                string1 = line[0:14].replace(" ", "")
                string2 = line[16:].replace(" ", "")
            #print string1, string2
            result += [string1, string2]
        f.close()
    return result

相关内容

  • 没有找到相关文章

最新更新