Celery Django Daemon多个虚拟环境

时间:2016-02-29 12:53:27

标签: django celery virtualenv daemon django-celery

我的问题如下:

我有一个django应用程序,我可以上传文件。上传文件时,将启动芹菜任务以根据其版本处理特定队列上的文件,如下所示:

import my_library

@app.task()
def process_file(file):
    result = my_library.process(file)
    model = MyModel(result=result)
    model.save()
    return

def file_upload(request):
    file = request.FILE['file']
    version = parse_version(file)
    process_file.run_async(file, queue=version)

所以我的库的每个版本都有一个队列。我的想法是创建多个守护进程,使用虚拟环境为我的库的每个队列/版本创建一个守护进程,以使用正确版本的my_library。

但我不知道如何正确地做到这一点。

具有不同版本的my_library无法共存,因为它们包含依赖于具有相同版本号的自定义C库的Cython函数。

2 个答案:

答案 0 :(得分:3)

  • 为您需要运行的每个版本的库创建一个单独的virtualenv
  • 在每个virtualenv
  • 中安装相应的库
  • 在virtualenv中安装您的代码
  • 使用supervisord为每个版本/ virtualenv运行一个单独的芹菜工作者。每个工作人员都会侦听不同的队列
  • 将任务dipatch到适当的队列

/etc/supervisor.d/celery.conf

[program:celery-version-1]
command = /path/to_venv_version_1/bin/python manage.py celery worker -Q version-1 ....

[program:celery-version-2]
command = /path/to_venv_version_2/bin/python manage.py celery worker -Q version-2 ....

[program:celery-version-3]
command = /path/to_venv_version_3/bin/python manage.py celery worker -Q version-3 ....

然后发送你的任务:

def file_upload(request):
    file = request.FILE['file']
    version = parse_version(file)
    process_file.run_async(file, queue=version)

答案 1 :(得分:0)

您正在混合代码版本控制和业务逻辑 - 这不是一个好主意。

最好为每个版本的文件使用一个具有不同功能的代码版本。