天天看點

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