如何解耦Django和芹菜?

时间:2016-05-13 07:55:20

标签: python django celery django-celery

在我的芹菜任务中,我有一个使用在GPU上运行的python模块(theano)的任务,该模块只能同时由一个线程导入。但要启动网站,我必须运行:

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

因此该模块将由celery和django网站导入,这是冲突的。有没有办法解耦Django和Celery,以便模块只导入一次?

1 个答案:

答案 0 :(得分:0)

出于测试目的,您可以在单线程模式下运行django开发服务器:python manage.py runserver --nothreading

你想只在芹菜工作者进程中import theano,而不是在django web服务器进程中,对吗?好吧,让我们使import有条件,这样就可以在celery中导入而不是在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环境变量集

启动芹菜工作者
celery_worker=yes celery -A celery_try worker -l info

为了区分芹菜工人和django,让我们在芹菜过程中设置一个bash环境变量,而不是在django过程中设置。我调用了变量celery_worker。为了进行设置,我使用per-command env variable assignmentcelery -A celery_try worker -l info添加了celery_worker=yes。现在,在python代码中,我检查环境变量是否存在。如果是的话,我们是芹菜工人,需要进口theano。

如果我们在django中,则不应定义os.environ['celery_worker'],并且应该引发异常。