如何将Django和Celery解耦



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

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

因此,该模块将由芹菜和django网站导入,这是冲突的。有没有一种方法可以解耦Django和Celery,使模块只导入一次?

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

您希望import theano只在芹菜工作进程中,而不是在django web服务器进程中,对吧?好的,让我们把import设为条件,这样它就可以在芹菜中导入,而不是在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。为了设置它,我在celery -A celery_try worker -l info前面加上了每个命令的env变量赋值:celery_worker=yes。现在,在python代码中,我检查环境变量是否存在。如果是的话,我们是芹菜工人,需要进口茶叶。

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

相关内容

  • 没有找到相关文章

最新更新