celery使用教程

celery是python的一个不错的队列组建,支持rabbitmq和redis,这里我用redis。

新建一个python项目

celery使用教程_第1张图片

右击项目名->open module settings->SDKs->packages

点右边+号,输入celery点install package。

celery使用教程_第2张图片

因为我是windows最新版本celery不兼容,所以选3.1.25。

先用个简单的例子

simpleTask.py

 

from celery import Celery

app = Celery('simpleTask', broker='redis://localhost:6379/0')

@app.task
def add(x, y):
    return x + y

这里面就一个个任务,计算两数相加

 

simpleCall.py

 

from simpleTask import add
add.delay(4, 4)

这里异步调用任务

 

运行simpleTask.py,在terminal输入:

celery -A simpleTask worker --loglevel=info

启动成功,可以看到下面输出

  warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))

 -------------- celery@justeene-PC v3.1.25 (Cipater)
---- **** -----
--- * ***  * -- Windows-7-6.1.7601-SP1
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         simpleTask:0x352a668
- ** ---------- .> transport:   redis://192.168.1.22:6379/0
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery

这里会打印一些work信息,比如连接的redis信息,并发线程数concurrency=8(默认是当前cpu的两倍)

 

然后运行simpleCall.py,由于是异步调用任务,所以没有这里没有任何输出

而celery控制台会输出运算结果:8

[2018-05-17 00:00:24,509: INFO/MainProcess] Received task: simpleTask.add[cbc759ff-f56a-4911-80f0-a9e581ac1641]
[2018-05-17 00:00:24,511: INFO/MainProcess] Task simpleTask.add[cbc759ff-f56a-4911-80f0-a9e581ac1641] succeeded in 0s: 8

接下来修改下代码,让simpleCall.py也能获得执行结果

修改simpleTask.py,加上结果后端backend,这里我依然用redis存储任务结果。

 

app = Celery('simpleTask', backend='redis://192.168.1.22:6379/0',broker='redis://192.168.1.22:6379/0')

修改simpleCall.py:

 

from simpleTask import add
import time

result = add.delay(4, 4)
print(result.ready())
time.sleep(1)
print(result.ready())
print(result.get())

result.ready()返回任务是否完成

result.get()就是获取任务返回值

 

再分别运行:

celery -A simpleTask worker --loglevel=info

simpleCall.py

可以看到simpleCall.py控制台输出:

第一个false是任务还未执行完,

后面的true是因为等待1秒后任务执行完了。

第三个8就是result.get()获取的任务返回结果。

 

这时候想到一点,如果任务执行异常了怎么办。

修改下simpleTask.py,模拟异常场景

 

@app.task
def add(x, y):
    10 * (1/0)
    return x + y

simpleCall.py

 

from simpleTask import add
import time

result = add.delay(4, 4)
print(result.ready())
time.sleep(1)
print(result.ready())
print(result.state)
print(result.traceback)

运行结果如下:

celery使用教程_第3张图片

result.state=FAILURE表示任务异常

还可以调用result.successful()判断任务是否成功

result.traceback可以输出异常信息。

常规功能已经满足了,后面还有制定队列和远程查看work状态我就不写了

 

你可能感兴趣的:(python)