Celery 简单使用

celery是一个分布式的任务队列,它可以通过一些方法实现异步任务处理。

第一部分为app部分:启动命令为:celery worker -A tsks -l INFO

import time

from celery import Celery

#创建一个Celery实例,这就是我们用户的应用app

my_task = Celery("tasks", broker="redis://:[email protected]:6379", backend="redis://:[email protected]:6379")

为应用创建任务,func1

@my_task.task

def func1(x, y):

    time.sleep(5)

    return x + y

 这里需要说明的是如果redis设置了protect mode那么这里需要带上密码的,即:password@host,而如果没有密码则应该是下面这种形式,具体可以在celery官网找到( https://docs.celeryproject.org/en/latest/getting-started/brokers/redis.html ):

my_task = Celery("tasks", broker="redis://127.0.0.1:6379", backend="redis://127.0.0.1:6379") 
 

from tsks import func1

将任务交给CeleryWorker执行

res = func1.delay(2,4)

#返回任务ID

print(res.id)

运行上面的代码,将任务交给celery,会返回任务id,在第三步中要用到

from celery.result import AsyncResult

from tsks import my_task

异步获取任务返回值

async_task = AsyncResult(id="aa6d73d8-d4fb-4b5b-b9ae-7e8a884a209e",app=my_task)

 

判断异步任务是否执行成功

if async_task.successful():

    #获取异步任务的返回值

    print(async_task.status)

    result = async_task.get()

    print(result)

else:

    print("任务还未执行完成")

简单的应用就这些,但在些过程中遇到一个问题,不过是关于redis的,报错信息如下:

[2020-01-26 16:53:09,499: ERROR/MainProcess] consumer: Cannot connect to redis://:**@192.168.

16.8:6379//: MISCONF Redis is configured to save RDB snapshots, but it is currently not able

to persist on disk. Commands that may modify the data set are disabled, because this instance

 is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsav

e-error option). Please check the Redis logs for details about the RDB error..

Trying again in 2.00 seconds…

解决办法为:修改/etc/sysctl.conf  在最后面添加一行:vm.overcommit_memory=1,然后重启sysctl: sudo sysctl -p /etc/sysctl.conf

ref:https://stackoverflow.com/questions/19581059/misconf-redis-is-configured-to-save-rdb-snapshots#21484282

 

上一篇:Linux wget命令

下一篇:Python 列表