在我的芹菜任务中,我有一个任务使用在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']
,并且应该引发一个异常。