一、生成器获取redis 数据
操作redis 列表.
import redis """ redis = { k1:[1,2,3,43,45] } """ conn = redis.Redis(host='47.94.172.250',port=6379,password='Luffy!4321') # 左插入 # conn.lpush('k1',11) # 右插入 # conn.rpush('k1',33) # 左获取 # val = conn.lpop('k1') # val = conn.blpop('k1',timeout=10) # hang住 # 右获取 # val = conn.rpop('k1') # val = conn.brpop('k1',timeout=10) # hang住 # conn.lpush('k1',*[11,22,33,44,55,66,77,88,99,66,666,2234,345234,234])
def list_iter(key,count=100): index = 0 while True: data_list = conn.lrange('k1', index, index+count-1) if not data_list: return index += count for item in data_list: yield item print(conn.lrange('k1',0,101)) for item in list_iter('k1',count=3): print(item)
二、celery 分布式消息队列
Cerlery 是基于python 开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行。
图2展示的是Celery的架构,它采用典型的生产生-消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。实际应用中,用户从Web前端发起一个请求,我们只需要将请求所要处理的任务丢入任务队列broker中,由空闲的worker去处理任务即可,处理的结果会暂存在后台数据库backend中。我们可以在一台机器或多台机器上同时起多个worker进程来实现分布式地并行处理任务。
1. 建立消息队列
首先,我们必须拥有一个broker消息对列用于发送和接收消息,celery官方给出了多个broker的备选方案:RabbitMQ,Redis, Database(不推荐)以及其他的消息中间件,在官方的推荐下,我们就使用RabbitMQ作为我们的消息中间件.在linux上安装的方式如下:
(安装 链接https://www.cnblogs.com/grayguo/p/5300776.html)
sudo apt-get install rabbitmq-server
命令执行成功后, rabbitmq-server就已经安装好并运行在后台了。
也可以通过命令rabbitmq-server来启动rabbitmq server,以及命令rabbitmqctl stop 命令来停止server.
Ubunt安装 方法二:使用APT来装 1.添加以下地址到/etc/apt/sources.list deb http://www.rabbitmq.com/debian/ testing main 2:public key 1 $ wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc sudo apt-key add 更新包 1 sudo apt-get update 安装Rabbitmq-server 1 sudo apt-get install rabbitmq-server 在rabbitmq安装的过程中,需要用到erlang,使用以上方法安装时,都可以自动安装这些必要的包 1 2 启动:sudo rabbitmq-server start 关闭: sudo rabbitmq-server stop
2. 安装django-celery
pip install celery pip install django-celery
3. 配置settings.py
首先,在Django工程的settings.py文件中加入如下配置代码:
import djcelery djcelery.setup_loader() BROKER_URL= 'amqp://guest@localhost//' CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
其中,当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。BROKER_URL和CELERY_RESULT_BACKEND分别指代你的Broker的代理地址以及Backend(result store)数据存储地址。在Django中如果没有设置backend,会使用其默认的后台数据库用来存储数据。注意,此处backend的设置是通过关键字CELERY_RESULT_BACKEND来配置,与一般的.py文件中实现celery的backend设置方式有所不同。一般的.py中是直接通过设置backend关键字来配置,如下所示:
app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')
然后,在INSTALLED_APPS中加入djcelery:
INSTALLED_APPS = ( ……
'qv', 'djcelery' …… )
4. 在要使用该任务队列的app根目录下(比如qv),建立tasks.py,比如:
在tasks.py中我们就可以编码实现我们需要执行的任务逻辑,在开始处import task,然后在要执行的任务方法开头用上装饰器@task。需要注意的是,与一般的.py中实现celery不同,tasks.py必须建在各app的根目录下,且不能随意命名。
5. 生产任务
在需要执行该任务的View中,通过build_job.delay的方式来创建任务,并送入消息队列。比如:
6. 启动worker的命令
#先启动服务器 python manage.py runserver #再启动worker python manage.py celery worker -c 4 --loglevel=info
四、补充
Django下要查看其他celery的命令,包括参数配置、启动多worker进程的方式都可以通过python manage.py celery --help来查看:
另外,Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现,如下图所示:
Django下实现的方式如下:
1. 安装flower:
pip install flower
2. 启动flower(默认会启动一个webserver,端口为5555):
python manage.py celery flower
3. 进入http://localhost:5555即可查看。