2016-05-18 38 views
-2

我想在我的Web服務器上有一個連續的背景循環。我仍然希望有可能打開和關閉循環使用瓶給我的芹菜工人的命令。芹菜中的while循環似乎只運行一次。在芹菜任務中設置一個while循環

from celery import Celery  
@app.task 
    def count(i): 
     if i == 1: # turn on command 
      while True: # a while loop to achieve what I want to do 
       i = i+1 
       return i 
     elif i == 0: # turn off command given by flask 
      return i 

我也試過celery_beat,但這需要我提前給出參數,而不是接受來自其他來源的命令。

app.conf.update(
CELERYBEAT_SCHEDULE = { 
    'add-every-1-seconds': { 
     'task': 'tasks.count', 
     'schedule': timedelta(seconds=1), 
     #'args': (1) 
    }, 
}) 
+1

你在while循環中有一個'return'。這就是它停止的原因。 – dirn

+0

反對票只是因爲這不是你應該如何使用芹菜。如果你需要一個正在運行的進程,只需要創建一個進程,那麼使用Celery將會是一個不必要的複雜因素。如果需要,每隔幾秒排隊一次任務,但是芹菜任務應該是有限的。 – joshua

+0

嗨,感謝您的解釋。但是,我希望只有在需要時才能調用此後臺進程。我也通過ssh或web界面遠程訪問,希望即使我註銷,該過程也會繼續運行。 –

回答

0

感謝@ dim的回答。我現在的代碼是:

@app.task 
def count(i): 
    if i == 1: 
     while True: # a while loop to achieve what I want to do 
      i = i+1 
      time.sleep(1) 
      print i 
      print 'i am counting' 

啓動工作:

$ celery -A tasks worker -l info 

而且從蟒蛇稱之爲

>> from tasks import count 
>> result = count(1) 

從蟒蛇停止循環

>> result.revoke(terminate=True) 

希望這對pe有用ople希望在他們的芹菜任務中有循環。