Python 如何将Django和芹菜分开?

Python 如何将Django和芹菜分开?,python,django,celery,django-celery,Python,Django,Celery,Django Celery,在我的芹菜任务中,我有一个任务使用在GPU上运行的python模块(theano),这个模块只能由一个线程同时导入。但要启动网站,我必须运行: python manage.py runserver celery -A celery_try worker -l info 因此该模块将由芹菜和django网站导入,这是冲突的。有没有办法将Django和芹菜解耦,以便只导入一次模块?出于测试目的,您可以在单线程模式下运行Django development server:python manage.

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

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

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

出于测试目的,您可以在单线程模式下运行Django development server:
python manage.py runserver--nothreading

您只想在芹菜工人进程中导入no,而不想在django web服务器进程中导入no,对吗?好的,让我们将导入设置为有条件的,这样就可以在芹菜中导入,而不是在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
并使用
cellery\u-worker
环境变量集启动芹菜工人:

celery_worker=yes celery -A celery_try worker -l info
为了区分芹菜工人和django,让我们在芹菜进程中设置一个bash环境变量,但不要在django进程中设置。我把这个变量称为芹菜工人。为了设置它,我用:
cellery\u worker=yes
预先设置了
cellery-A芹菜\u try worker-l info
。现在,在python代码中,我检查环境变量是否存在。如果是,我们是芹菜工人,需要进口茶多酚


如果我们在django,
os.environ['celery\u worker']
不应该被定义,并且应该引发一个异常。

我不确定为什么运行这两个进程意味着必须在这两个进程中导入模块。在Django视图中,我导入任务,因此Django服务器导入相同的模块tasks.py导入,而芹菜也导入tasks.py导入的任何任务,这就是进程导入模块的方式。芹菜本身默认在Django外部运行!这取决于您如何初始化它,例如,如果您的模块正在加载所有django堆栈和所有django应用程序,那么还有一件事-每个工作进程将在其自己的子进程或线程中运行-因此,如果您有两个工作进程,每个工作进程将加载Ano模块,并且您将遇到相同的问题,可能会编写自己的最小服务器来处理任务,您将确保它只运行一次,并且您可以完全控制它如何运行
python manage.py runserver——如果读取不起作用,我仍然会收到相同的错误消息。我不太理解你的解耦解决方案,你能解释一下吗?谢谢。@demondge您想只在芹菜工人进程中导入ano,而不是在django web服务器进程中导入ano,对吗?好的,让我们将导入设置为有条件的,这样就可以在芹菜中导入,而不是在django中导入。为了区分芹菜工人和django,让我们在芹菜进程中设置一个bash环境变量,但不要在django进程中设置。我把这个变量称为芹菜工人。为了设置它,我使用per command env变量赋值预先设置了
celery-A celery\u try worker-l info
celery\u worker=yes
。现在,在python代码中,我检查环境变量是否存在,以及它是否为import theano。问题是我不能选择不导入theano。当我启动服务器时,views.py将自动从芹菜中导入任务,这将导入No。当我运行芹菜工作来处理任务时,芹菜将再次导入tasks.py,这将再次导入ano。不,你可以!只需将导入设置为有条件。我在我的示例中添加了一些代码内注释,使其更加明确。如果os.environ['celery\u worker']
不存在,则不会导入theano,如果存在,则会导入theano。如果运行
python manage.py runserver
,芹菜工人将未定义,并且不会导入编号。如果您正在运行芹菜,则芹菜工人已定义,因此将发生导入。