django python3 异步_Celery 3 版本 定时执行与 异步执行 | Django 案例

Celery介绍

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery。

软件架构

Django案例

环境

* python3.6.4

* django 2.0

* django-celery==3.2.1

* django-kombu==0.9.4

* celery-with-redis==3.0

* celery==3.1.25

目录结构

autoops/

autoops/settings

tasks/tasks.py

settings

import djcelery

INSTALLED_APPS = [

'djcelery',

'kombu',

]

djcelery.setup_loader()

BROKER_URL = 'redis://127.0.0.1:6379/0' #消息存储数据存储在仓库0

CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' # 指定 Backend

CELERY_ACCEPT_CONTENT = ['application/json']

CELERY_TASK_SERIALIZER = 'json'

CELERY_RESULT_SERIALIZER = 'json'

CELERY_TIMEZONE = 'Asia/Shanghai'

#CELERY_ALWAYS_EAGER = True # 如果开启,Celery便以eager模式运行, 则task便不需要加delay运行

CELERY_IMPORTS = ('tasks.tasks',)

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' #这是使用了django-celery默认的数据库调度模型,任务执行周期都被存在你指定的orm数据库中

tasks.py

from celery import Celery, platforms

platforms.C_FORCE_ROOT = True

app = Celery('my_task')

app.config_from_object('django.conf:settings',)

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task()

def ansbile(): ##如果想异步调用 ansible api,请在任务前面添加如下

from multiprocessing import current_process

# try:

# current_process()._config

# except AttributeError:

current_process()._config = {'semprefix': '/mp'}

@app.task()

def cmd_job(host,cmd): ## 执行命令

i = asset.objects.get(network_ip=host)

ret = ssh(ip=i.network_ip, port=i.port, username=i.username, password=i.password, cmd=cmd)

return ret['data']

def test(): ## 下面是异步调用 celery 的例子

from tasks.tasks import cmd_job

aa = cmd_job.apply_async(args=('43.241.238.109', 'pwd'))

print("id",aa.task_id,"返回值",aa.get() ,aa.result, "状态",aa.state)

from djcelery.models import TaskMeta

b = TaskMeta.objects.get(task_id=aa).result

print("返回值",b)

Django 后台

以下是定时执行,直接后台操作即可。很简单。

数据库结构

* | celery_taskmeta ##异步任务,会将结果写入到这个表内

* | celery_tasksetmeta

* | djcelery_crontabschedule

* | djcelery_intervalschedule

* | djcelery_periodictask

* | djcelery_periodictasks

* | djcelery_taskstate ##django后台执行的定时任务,会将结果写到这个表里

* | djcelery_workerstate

from djcelery.models import TaskMeta,TaskState ##这样获取表

在数据库里看 result 内容是乱码,但是 通过orm获取的时候,显示是正常的。请知悉。

启动命令

#实际执行任务的程序

/usr/bin/python /opt/autoops/manage.py celery worker -c 4 --loglevel=info

#任务调度, 根据配置文件发布定时任务

/usr/bin/python /opt/autoops/manage.py celery beat --schedule=/tmp/celerybeat-schedule --pidfile=/tmp/django_celerybeat.pid --loglevel=INFO

# Django 检查 workers 是否在线

/usr/bin/python /opt/autoops/manage.py celerycam --frequency=10.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Celery是一个Python分布式任务队列,它可以帮助我们异步执行任务,而且还可以定时执行任务。下面是使用DjangoCelery框架来实现定时任务的执行的步骤: 1. 安装Celery。可以使用pip工具来安装Celery。 ```bash pip install celery ``` 2. 配置Django项目。在Django项目的settings.py文件中加入以下配置: ```python INSTALLED_APPS = [ # ... 'django_celery_results', 'django_celery_beat', # ... ] CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'django-db' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_SERIALIZER = 'json' ``` 其中,CELERY_BROKER_URL是指定Celery使用Redis作为消息代理,CELERY_RESULT_BACKEND是指定Celery的结果存储方式为Django数据库,CELERY_ACCEPT_CONTENT、CELERY_RESULT_SERIALIZER和CELERY_TASK_SERIALIZER则是指定消息的序列化方式。 3. 创建定时任务。在Django项目的tasks.py文件中定义需要定时执行的任务。例如: ```python from celery import shared_task @shared_task def hello(): print('Hello, World!') ``` 4. 配置定时任务。在Django项目的settings.py文件中加入以下配置: ```python CELERY_BEAT_SCHEDULE = { 'hello_task': { 'task': 'tasks.hello', 'schedule': 10.0, }, } ``` 其中,'hello_task'是任务的名称,'task'指定了任务的函数名,'schedule'则指定了任务的执行间隔时间。 5. 启动Celery。在Django项目的根目录下执行以下命令启动Celery: ```bash celery -A your_project_name worker -l info -B ``` 其中,-A参数指定了Celery要加载的Django项目的名称,-B参数表示启用定时任务。 6. 测试定时任务是否生效。等待10秒钟后,可以在控制台看到输出了'Hello, World!',表示定时任务已经成功执行。 以上就是使用DjangoCelery框架来实现定时任务的执行的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值