python测试开发django-196.python3.8+django2+celery5.2.7环境准备

以前的芹菜版本需要一个单独的库(django-celery)来处理Django,但从3.1开始就不再是这样了。

[En]

Previous versions of Celery required a separate library (django-celery) to work with Django, but this is no longer the case since 3. 1.

现在开箱即可支持Django,因此本文档只包含集成芹菜和Django的基本方法。

[En]

Django is now supported out of the box, so this document contains only the basic methods of integrating Celery and Django.

celery5.x 不支持windows平台了。Celery 5.0.x 支持 Django 1.11 LTS 或更新版本。

Celery 5.2 版运行于

  • Python❨3.7、3.8、3.9、3.10❩
  • PyPy3.7、3.8 ❨7.3.7❩

Celery 4.x 是支持 Python 2.7 的最后一个版本,
Celery 5.x 需要 Python 3.6 或更高版本。
Celery 5.1.x 还需要 Python 3.6 或更高版本。
Celery 5.2.x 需要 Python 3.7 或更新版本。

如果您运行的是较旧版本的Python,则需要运行较旧版本的芹菜:

[En]

If you are running an older version of Python, you need to run an older version of Celery:

Python 2.7 或 Python 3.5:Celery 系列 4.4 或更早版本。
Python 2.6:Celery 系列 3.1 或更早版本。
Python 2.5:Celery 系列 3.0 或更早版本。
Python 2.4 是 Celery 系列 2.2 或更早版本。

Celery 是一个资金很少的项目,所以不支持 Microsoft Windows。请不要打开与该平台相关的任何问题。

运行系统:Linux(centos/debian/ubuntu),不支持Windows

[En]

Running system: linux (centos/debian/ubuntu), does not support windows

Python版本:3.8.5
Django : 2.2.2
celery: 5.2.7

使用pip安装celery5.2.7版本

[En]

Install the celery5.2.7 version using pip

pip install celery==5.2.7

要在Django项目中使用芹菜,您必须首先定义一个芹菜库的实例(称为“应用程序”)

[En]

To use Celery in a Django project, you must first define an instance of the Celery library (called “application”)

如果您有一个现代的Django项目布局,例如:

[En]

If you have a modern Django project layout, such as:

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

推荐的方法是创建一个新的proj/proj/celery.py模块来定义芹菜实例:

[En]

The recommended approach is to create a new proj/proj/celery.py module to define the Celery instance:

proj/proj/celery.py 文件内容

import os

from celery import Celery

# Set the default Django settings module for the 'celery' program.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.

# - namespace='CELERY' means all celery-related configuration keys
#   should have a CELERY_ prefix.

app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django apps.

app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

然后你需要在你的proj/proj/ init.py 模块中导入这个应用程序。这可以确保在 Django 启动时加载应用程序,以便@shared_task装饰器(稍后提到)将使用它:

proj/proj/__init__.py内容:

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.

from .celery import app as celery_app

__all__ = ('celery_app',)

请注意,此示例项目布局适用于较大的项目,而对于简单项目,您可以使用单个包含的模块来定义应用程序和任务

[En]

Note that this sample project layout is suitable for larger projects, and for simple projects, you can use a single included module to define applications and tasks

让我们分解第一个模块中发生的事情,首先,我们设置默认值DJANGO_SETTINGS_MODULEcelery命令行程序的环境变量:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

您不需要这一行,但它消除了总是将设置模块传递给Celery程序的需要。它必须始终在创建应用程序实例之前出现,正如我们接下来要做的那样:

[En]

You don’t need this line, but it eliminates the need to always pass the setup module to the celery program. It must always appear before the application instance is created, as we will do next:

app = Celery('proj')

这是我们的库的一个示例,您可以有许多实例,但在使用Django时可能没有理由这样做。

[En]

This is an example of our library, and you can have many instances, but there may be no reason to do so when using Django.

我们还添加了Django设置模块作为芹菜的配置源。这意味着您不必使用多个配置文件,但您可以直接从Django设置中配置芹菜,但如果需要,您也可以将它们分开。

[En]

We also added the Django setup module as the configuration source for Celery. This means that you don’t have to use multiple profiles, but you can configure Celery; directly from the Django settings, but you can also separate them if necessary.

app.config_from_object('django.conf:settings', namespace='CELERY')

大写命名空间意味着所有 Celery 配置选项 必须以大写而不是小写指定,并且以 开头 CELERY_,例如task_always_eager设置变为CELERY_TASK_ALWAYS_EAGER,broker_url 设置变为CELERY_BROKER_URL。这也适用于工作人员设置,例如,worker_concurrency 设置变为CELERY_WORKER_CONCURRENCY.

例如,Django项目的配置文件可能包括:

[En]

For example, the configuration file for a Django project might include:

...

# Celery Configuration Options
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60

接下来,可重用应用程序的常见实践是在单独的tasks.py模块中定义所有任务,而Celery确实有一种自动发现这些模块的方法:

[En]

Next, a common practice for reusable applications is to define all tasks in separate tasks.py modules, and Celery does have a way to automatically discover these modules:

app.autodiscover_tasks()

使用上面的代码,Celery将遵循tasks.py约定,自动从您安装的所有应用程序中发现任务:

[En]

Using the above code, Celery automatically discovers tasks from all applications you install, following the tasks.py convention:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

这样您就不必手动将各个模块添加到CELERY_IMPORTS设置中。

最后,该debug_task示例是一个转储自己的请求信息的任务。这是使用bind=True Celery 3.1 中引入的新任务选项来轻松引用当前任务实例。

您编写的任务可能存在于可重用应用程序中,并且可重用应用程序不能依赖于项目本身,因此您不能直接导入应用程序实例。

[En]

The tasks you write may exist in reusable applications, and reusable applications cannot depend on the project itself, so you cannot import your application instance directly.

装饰器允许您在@shared_task没有任何具体应用实例的情况下创建任务:

demoapp/tasks.py:

# Create your tasks here

from demoapp.models import Widget

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

@shared_task
def mul(x, y):
    return x * y

@shared_task
def xsum(numbers):
    return sum(numbers)

@shared_task
def count_widgets():
    return Widget.objects.count()

@shared_task
def rename_widget(widget_id, name):
    w = Widget.objects.get(id=widget_id)
    w.name = name
    w.save()

您可以在以下位置找到 Django 示例项目的完整源代码: https ://github.com/celery/celery/tree/master/examples/django/

django-celery-results- 使用 Django ORM/Cache 作为结果后端
django-celery-results扩展使用Django ORM 或 Django Cache 框架提供结果后端。

要将其用于您的项目,您需要执行以下步骤:

[En]

To use it for your project, you need to perform the following steps:

1.安装django-celery-results库:

 pip install django-celery-results

2.添加django_celery_results到INSTALLED_APPS您的 Django 项目中settings.py:

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

注意,模块名称中没有破折号,只有一个下划线。

[En]

Notice that there is no dash in the module name, only an underscore.

3.通过执行数据库迁移来创建 Celery 数据库表:

 python manage.py migrate django_celery_results

4.配置 Celery 以使用django-celery-results后端。
假设您使用Djangosettings.py配置芹菜并添加以下设置

[En]

Suppose you use Djangosettings.py to configure Celery and add the following settings

CELERY_RESULT_BACKEND = 'django-db'

对于缓存后端,您可以使用:

[En]

For the cache backend, you can use:

CELERY_CACHE_BACKEND = 'django-cache'

我们还可以使用Django的缓存设置中定义的缓存。

[En]

We can also use the cache defined in django’s CACHES settings.

# celery setting.

CELERY_CACHE_BACKEND = 'default'

# django setting.

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}

在生产环境中,您希望将工作程序作为后台守护进程运行(请参阅守护进程),但对于测试和开发,能够使用Celery Worker Manage命令启动工作程序的实例非常有用,就像您使用Django的made.py runserver所做的那样:

[En]

In a production environment, you will want to run the working program as a daemon in the background-see daemon-but for testing and development, it is useful to be able to start an instance of the working program using the celery worker manage command, just as you do using Django’s manage.py runserver:

celery -A proj worker -l INFO

有关可用命令行选项的完整列表,请使用Help命令:

[En]

For a complete list of available command line options, use the help command:

 celery help

Original: https://www.cnblogs.com/yoyoketang/p/16466967.html
Author: 上海-悠悠
Title: python测试开发django-196.python3.8+django2+celery5.2.7环境准备

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6348/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部