Celery异步分布式
什么是celery?
他是一个python开发的异步分布式任务调度模块
celery本身不提供消息服务,使用第三方服务,也就是broker来传递任务,目前支持rabbitmq,redis,数据库等等。
我们使用redis
连接URL的格式为:
<code> </code><code>redis:</code><code>/</code><code>/</code><code>:password@hostname:port</code><code>/</code><code>db_number</code>
例如:
<code> </code><code>BROKER_URL</code><code>=</code><code>'redis://localhost:6379/0'</code>
过程如图示
在python里面如果用到异步分布式,首先想到celery
安装celery
<code>pip </code><code>install</code> <code>celery</code>
<code>pip </code><code>install</code> <code>redis </code><code>#之前讲过</code>
在服务器上安装redis服务器,并启动redis
第一个简单的例子:
<code>[root@localhost celery]</code><code># cat lili.py</code>
<code>#/usr/bin/env python</code>
<code>#-*- coding:utf-8 -*-</code>
<code>from</code> <code>celery </code><code>import</code> <code>Celery</code>
<code>broker</code><code>=</code><code>"redis://192.168.48.131:6379/5"</code>
<code>backend</code><code>=</code><code>"redis://192.168.48.131:6379/6"</code>
<code>app </code><code>=</code> <code>Celery(</code><code>"lili"</code><code>, broker</code><code>=</code><code>broker, backend</code><code>=</code><code>backend)</code>
<code>@app</code><code>.task</code>
<code>def</code> <code>add(x, y):</code>
<code> </code><code>return</code> <code>x</code><code>+</code><code>y</code>
启动:
<code># celery -A lili worker -l info</code>
调用:
<code># cat demo2.py</code>
<code>#!/usr/bin/python</code>
<code>from</code> <code>lili </code><code>import</code> <code>add</code>
<code>import</code> <code>time</code>
<code>a </code><code>=</code> <code>add.delay(</code><code>10</code><code>, </code><code>20</code><code>)</code>
<code>print</code> <code>(a) </code><code>##返回异步分布式的对象</code>
<code>print</code> <code>(</code><code>type</code><code>(a))</code>
<code>time.sleep(</code><code>1</code><code>)</code>
<code>print</code> <code>(a.result) </code><code>##返回调用的值</code>
<code>print</code> <code>(a.status) </code><code>##返回状态</code>
<code>print</code> <code>(a.get(timeout</code><code>=</code><code>3</code><code>)) </code><code>##获得值</code>
<code>print</code> <code>(a.ready()) </code><code>#是否处理,返回 True 为处理完成</code>
<code></code>
本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/2052240