2017-05-25 16 views
0

これは非常に素朴な質問ですが、私はdjangoとpythonの非同期/バックグラウンドタスクに関する基本的なことを理解していないと感じています。並列プロセスを開始せずにDjangoでバックグラウンドプロセスを実行できますか?

djangoが実際に実行されたより60秒後にバックグラウンドタスクを実行するために、django-background-tasks(https://github.com/collinmutembei/django-background-tasks-example)が提供する簡単な例を複製しようとしています。しかし、私は同じことがセロリやヒューイのような他のバックグラウンドタスクマネージャーにも当てはまると思います。

例は非常に単純です - ユーザーがURLにアクセスするとすぐに、メッセージを印刷する単純な関数がmainジャンゴプロセス、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

バックグラウンドでタスクを実行するために別のプロセスを実行するのは良いことではありません。

サーバーを実行すると、Webリクエストの処理を担当するプロセスが作成され、実行されます(ps aux | grep runserver)。バックグラウンドで特定のタスクを実行したいと言うと、暗黙のうちに、それらのタスクを実行する別々のプロセスが必要なことを意味します。セロリのような非同期タスクツールがでてくるところです

あなたはまた、自分自身を別のプロセスを起動することができます - あなたが言ったように - 行うことによって:。この方法はまた、完全に罰金です

import subprocess 

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

をあなただけの一つを持っている場合並行して実行したい2つの小さなタスク。しかし、バックグラウンドで実行している複雑なタスクがたくさんある場合、それらを適切に管理したいと考えています。また、何か問題が生じた場合には、それらのタスクをデバッグできる必要があります。後で、すべてのバックグラウンドタスク、ステータスなどで何が起こっているかをより詳細に把握する必要があります。これがセロリが役立つところです。それはあなたのためにそれらのすべてのものを処理する装飾方法を与えるでしょう。あなたはあなたのビジネスロジックについて心配する必要があります

1

はRabbitMQのか、Redisのようなメッセージブローカーと側面に沿ってセロリを使用して達成することができます。この記事では、それを達成する方法についてのいくつかの洞察を提供するかもしれません。Asynchronous tasks in Django

+0

ありがとう!私の質問は別のプロセス(セロリの場合は 'Celery -A celeryProj worker -l info'のような)が必要なのか、それとも私はdjangoプロジェクトの中から実行できますか? –

+0

これはdjangoプロジェクトから実行する必要があります – AR7

関連する問題