2016-05-13 2 views
3

私のセロリの仕事では、私はGPUで動作するPythonモジュール(theano)を使用するタスクを持っていますが、このモジュールは同時に1つのスレッドでしかインポートできません。しかし、ウェブサイトを開始するには、私が実行する必要があります。DjangoとCeleryを切り離す方法は?

python manage.py runserver 
celery -A celery_try worker -l info 

をので、モジュールは、競合の両方セロリとDjangoウェブサイトでインポートされます。モジュールが一度だけインポートされるようにDjangoとCeleryを切り離す方法はありますか?

+0

なぜ両方のプロセスを実行すると、両方でモジュールをインポートする必要があるのか​​分かりません。あなたがそれらのいずれかでそれをインポートしたくない場合は、しないでください。 –

+0

Djangoのビューでは、Djangoサーバーがタスクモジュールのインポートと同じモジュールをインポートします。セロリは、どのようなタスクもimportするので、両方のプロセスがモジュールをインポートする方法です。 – Demonedge

+0

セロリ自体はデフォルトでジャンゴの外で実行されています! 問題を初期化する方法です(例:あなたのモジュールがすべてのdjangoスタックとすべてのdjangoアプリケーションをロードしている場合 – Jerzyk

答えて

0

テスト目的のために、django開発サーバをシングルスレッドモードで実行することができます:python manage.py runserver --nothreading

あなたはimport theanoだけセロリのワーカープロセスでは、djangoのWebサーバーのプロセスではなく、右にしたいですか?さて、インポートを条件付きにして、それがセロリでインポートされ、djangoではインポートされないようにしましょう。

import os 

try: 
    # next line will raise exception in django, but will work fine in celery 
    is_worker = os.environ['celery_worker'] 
    import theano # celery will import theano, django won't 
except Exception as exc: 
    # django code will catch exception that celery_worker doesn't exist and print it here 
    print exc 

そしてcelery_worker環境変数セットを使用してセロリの労働者を起動しますのはなく、Djangoの過程で、セロリの過程で、bashの環境変数を設定してみましょう、セロリの労働者とDjangoを区別するために

celery_worker=yes celery -A celery_try worker -l info 

。私はその変数celery_workerを呼び出しました。それを設定するために、私はper-command env variable assignmentcelery_worker=yescelery -A celery_try worker -l infoを前に追加しました。今、Pythonコードで、私は環境変数が存在するかどうかをチェックします。そうであれば、私たちはセロリの労働者であり、theanoをインポートする必要があります。

私たちがdjangoの場合は、os.environ['celery_worker']を定義してはならず、例外が発生するはずです。

+0

'python manage.py runserver --nothreading'は動作しません。 。そして私はあなたのデカップリングソリューションをよく理解していません、もっと詳しく説明できますか?ありがとう。 – Demonedge

+0

@Demonedgeあなたはdanango Webサーバープロセスではなく、セラーリワーカープロセスでのみ '' theano'をインポートしますか?さて、インポートを条件付きにして、それがセロリでインポートされ、djangoではインポートされないようにしましょう。セロリの作業者とdjangoを区別するために、セロリプロセスではbash環境変数を設定しますが、djangoプロセスでは設定しません。私はその変数 'celery_worker'を呼び出しました。それを設定するために、私は 'celery -A celery_try worker -l info'をコマンドごとのenv変数代入:' celery_worker = yes'の前に追加しました。今、Pythonのコードで、私は環境変数が存在するかどうか、それがインポートtheanoであるかどうかをチェックします。 –

+0

私はTheanoをインポートしないことを選択できないという問題があります。サーバーを起動すると、views.pyはCeleryからタスクを自動的にインポートし、Theanoをインポートします。タスクを処理するためにCeleryの作業を実行すると、Celeryはtasks.pyをインポートして、Theanoを再びインポートします。 – Demonedge

関連する問題