簡體   English   中英

Celery實際如何執行任務?

[英]How does Celery actually execute the task?

我在目錄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()

當我用celery運行此腳本時,它提供以下結果

[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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM