2017-05-25 100 views
0

這是一個非常天真的問題,但我覺得我不明白django和python中異步/後臺任務的基本知識。我可以在沒有啓動並行進程的情況下在Django中運行後臺進程嗎?

我嘗試複製django-background-tasks(https://github.com/collinmutembei/django-background-tasks-example)提供的一個簡單示例,以便讓django比實際運行晚60秒執行後臺任務。但我想這同樣適用於任何其他後臺任務管理器,如Celery或Huey

該示例非常簡單 - 只要用戶訪問url,就會執行打印消息的簡單函數,而不會阻止主Django的過程中,60秒後

from background_task import background 
    from logging import getLogger 

    logger = getLogger(__name__) 

    @background(schedule=60) 
    def demo_task(message): 
     logger.debug('demo_task. message={0}'.format(message)) 

的問題是,我真的不明白的基礎知識。它不運行,除非我開始一個單獨的(或分離的)過程python manage.py process_tasks。我是否應該始終這樣做以使後臺任務有效,或者有辦法在不啓動並行進程的情況下執行該任務?

如果我應該開始一個並行進程,我可以從django代碼中執行它。喜歡的東西:

import subprocess 

    process = subprocess.Popen(['python', 'manage.py','process_tasks'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

回答

2

這不是必要的,但運行單獨的進程以便在後臺運行任務很有幫助。

當您運行服務器時,會創建一個進程 - 運行ps aux | grep runserver - 負責提供Web請求。當你說你想在後臺運行某些任務時,它隱含地意味着你需要一個單獨的進程來執行這些任務。這是異步任務的工具,如芹菜進來

您也可以自己生成一個獨立的過程 - 就像你說的 - 這樣做:

import subprocess 

process = subprocess.Popen(['python', 'manage.py','process_tasks'], stdout=subprocess.PIPE, stderr=subprocess.PIPE 

這種方法也完全沒問題,如果你只有一個或你想要並行運行兩個小任務。但是,當您在後臺運行大量複雜的任務時,您需要正確管理它們。此外,如果出現問題,您需要能夠調試這些任務。之後,您需要更多地瞭解所有後臺任務及其狀態等情況。芹菜將爲您提供幫助。它會給你裝飾的方法,將爲你處理所有這些事情。您只需擔心您的業務邏輯,然後

1

在Django運行的異步任務可以通過沿側西芹喜歡的RabbitMQ或Redis的消息代理來完成。本文可能會爲您提供一些有關如何實現它的信息Asynchronous tasks in Django

+0

謝謝!我的問題是,如果有必要有一個單獨的過程(如'celery-celeryProj工人-l信息'在芹菜的情況下),或者我可以從django項目內運行它? –

+0

你必須從django項目運行它 – AR7

相關問題