天天看点

43. Python celery简介

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