一、celery简述:

应用场景:在程序运行过程中,要执行一个很久的任务,但是我们又不想主程序被阻塞,常见的方法是多线程。可是当并发量过大时,多线程也会扛不住,必须要用线程池来限制并发个数,而且多线程对共享资源的使用也是很麻烦的事情。还有就是前面几篇介绍过的协程,但是协程毕竟还是在同一线程内执行的,如果一个任务本身就要执行很长时间,而不是因为等待IO被挂起,那其他协程照样无法得到运行。

(当请求很耗时间,用户需要等待很长时间时,用户体验非常糟糕,但凡耗时间的任务都要放到多线程多进程里面:要么启动进程或者线程,协程可以在随意切换,任务之间没有因果关系就可以并发。)

同步:同步意味着阻塞

异步:这个方法没有阻塞就是异步,非阻塞

celery可以异步,配置消息队列

celery简要说明:celery是一个简单、灵活可靠的处理大量消息的分布式系统,并且提供维护这样一个系统的必须工具,它是专注于试试处理的任务队列,同时也支持任务调度。

推荐阅读:《celery官方文档中文版》http://docs.jinkan.org/docs/celery/

消息队列 延迟消息 实现 消息队列怎么实现_多线程

      celery是一个本身不提供丢了服务,官方推荐使用rabbitMQ或Redis来实现消息丢了服务,前者是更好的选择,它对AMQP(高级消息队列协议)做出了非常好的实现

 

安装celery--------------------------------------------------------------------------------------

Windows使用celery只能安装 3.1.25版

pip install celery==3.1.25

运行celery:

python -m celery worker -A services.task

配置参考:

CELERY_BROKER = 'sqla+sqlite:///data/celery.db'
app = Celery('send', broker=CELERY_BROKER)
app.conf.update(
    CELERY_TASK_SERIALIZER='json',
    CELERY_ACCEPT_CONTENT=['json'],  # Ignore other content
    CELERY_RESULT_SERIALIZER='json',
    CELERYD_CONCURRENCY = 1
)

其他使用与linux上面使用没什么差别------------------------------------------------------

 

1.安装rabbitMQ

docker pull rabbitmq

创建新容器(创建 -d :后台运行 ;-p: 映射端口 前面是映射出来的端口,可以自己改):

docker run -d -p 5672:5672 --name myrabbit rabbitmq

查看:docker ps

2.创建用户、资源以及分配操作权限

配置——>进入容器:docker container exec -it myrabbit /bin/bash

新增用户:rabbitmqctl add_user hnq 123456

查看用户:rabbitmqctl list_users

设置管理员:rabbitmqctl set_user_tags hnq administrator

添加虚拟环境:rabbitmqctl add_vhost myvhost

查看:rabbitmqctl list_vhosts

设置权限:给这个用户所有权限:rabbitmqctl set_permissions -p myvhost hnq ".*" ".*" ".*"

消息队列 延迟消息 实现 消息队列怎么实现_性能优化_02

退出:exit

重启容器:docker restart myrabbit

查看:docker ps

 

3.创建celery实例

打开项目——>查看是否有celery:pip install celery

消息队列 延迟消息 实现 消息队列怎么实现_多线程_03

修改:/fang/init.py

import os
import celery
import pymysql
from django.conf import settings

pymysql.install_as_MySQLdb()

# 项目名称
project_name = 'fang'
project_settings = '%s.settings' % project_name

# 注册环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings)

app = celery.Celery(project_name,
                    #我使用的是阿里云ip
                    backend='amqp://jackfrued:123456@xx.xxx.xxx.x:5672/myvhost',
                    broker='amqp://jackfrued:123456@xx.xxx.xxx.x:5672/myvhost')


# 从默认的配置文件读取配置信息
app.config_from_object('django.conf:settings')

# Celery加载所有注册的应用
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

# 添加定时任务
"""
app.conf.update(
    timezone='Asia/Shanghai',
    enable_utc=True,
    beat_schedule={
        'task1': {
            'task': 'tasks.print_dummy_info',
            'schedule': crontab(),
            'args': ('你妈喊你回家吃饭啦', )
        },
    },
)
"""

4.启动celery创建woker

celery -A fang woker -l info &

5.执行异步任务

消息队列 延迟消息 实现 消息队列怎么实现_docker_04

消息队列 延迟消息 实现 消息队列怎么实现_mysql_05

 

提示:Linux下修改环境变量命令--------------------------------------------------------------------------------------

export指定linux最常见的就是lamp配置,指定软件运行路径为例。

比如指定php 或mysql执行的路径变量

[root@mail ~]#export PATH=$PATH:/usr/local/php/bin  为php环境

[root@mail ~]#export PATH=$PATH:/usr/local/mysql/bin 为mysql环境

如果设置多个可以采用格式[root@mail ~]#export PATH=$PATH:/usr/local/mysql/bin;

命令:vi ~/.bash_profile

消息队列 延迟消息 实现 消息队列怎么实现_消息队列 延迟消息 实现_06

Windows下直接在环境变量里增加键值对(坑是需要重启才能识别)

消息队列 延迟消息 实现 消息队列怎么实现_docker_07