Celery Django Daemon 多重虚拟环境
Celery Django Daemon Multiple Virtual Environment
我的问题如下:
我有一个可以上传文件的 Django 应用程序。上传文件时,将启动 celery 任务以根据其版本在特定队列上处理文件,如下所示:
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)
所以我的库的每个版本都有一个队列。我的想法是创建多个守护进程,每个 queue/version 我的库一个,使用虚拟环境使用正确版本的 my_library。
但我不知道如何正确地做到这一点。
my_library 不同版本不能共存,因为它们包含依赖于具有相同版本号的自定义 C 库的 Cython 函数。
您正在混合代码版本控制和业务逻辑 - 这不是一个好主意。
您最好使用一个版本的代码,每个版本的文件具有不同的功能。
- 为每个需要的库版本创建一个单独的 virtualenv 运行
- 在每个 virtualenv 中安装适当的库
- 在 virtualenv 中安装您的代码
- 使用 supervisord 为每个 version/virtualenv 运行 一个单独的芹菜工人。每个工作人员监听不同的队列
- 将任务分配到适当的队列
/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)
我的问题如下:
我有一个可以上传文件的 Django 应用程序。上传文件时,将启动 celery 任务以根据其版本在特定队列上处理文件,如下所示:
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)
所以我的库的每个版本都有一个队列。我的想法是创建多个守护进程,每个 queue/version 我的库一个,使用虚拟环境使用正确版本的 my_library。
但我不知道如何正确地做到这一点。
my_library 不同版本不能共存,因为它们包含依赖于具有相同版本号的自定义 C 库的 Cython 函数。
您正在混合代码版本控制和业务逻辑 - 这不是一个好主意。
您最好使用一个版本的代码,每个版本的文件具有不同的功能。
- 为每个需要的库版本创建一个单独的 virtualenv 运行
- 在每个 virtualenv 中安装适当的库
- 在 virtualenv 中安装您的代码
- 使用 supervisord 为每个 version/virtualenv 运行 一个单独的芹菜工人。每个工作人员监听不同的队列
- 将任务分配到适当的队列
/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)