在我的芹菜任务中,我有一个使用在GPU上运行的python模块(theano)的任务,该模块只能同时由一个线程导入。但要启动网站,我必须运行:
python manage.py runserver
celery -A celery_try worker -l info
因此该模块将由celery和django网站导入,这是冲突的。有没有办法解耦Django和Celery,以便模块只导入一次?
答案 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 assignment:celery -A celery_try worker -l info
添加了celery_worker=yes
。现在,在python代码中,我检查环境变量是否存在。如果是的话,我们是芹菜工人,需要进口theano。
如果我们在django中,则不应定义os.environ['celery_worker']
,并且应该引发异常。