Celery学习笔记----趟一下 celery 的坑

版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/wem603947175/article/details/83063931

celery中文文档


那么什么是Celery呢?

Celery是一个用Python开发的异步的分布式任务调度模块。

Celery本身不包含消息服务,使用第三方消息服务,也就是Broker,来传递任务,目前支持的有Rebbimq,Redis,数据库以及其他的一些比如Amazon SQS,Monogdb和IronMQ 。

因为项目里面用的是Redis,所以这里以Redis作为Broker。


安装


pip  install celery

使用Redis作为Broker的话,可以两者一块安装

sudo pip install -U celery[redis]

当然如果正式生产环境中,有可能redis服务器和Celery在不同的机器上面的话,就要两者单独安装

sudo apt-get install redis-server 这个命令可以安装redis,包括了redi-cli工具

第一个例子:

这是在celery中文文档中的代码,你需要修改成自己的

from celery import Celery

app = Celery('hello', broker='amqp://guest@localhost//')

@app.task
def hello():
    return 'hello world'

我是把代码保存为celery_tasks文件夹下的tasks.py文件(这个例子运行在ubuntu下的,上面运行了Redis,所以broker可以是127.0.0.1或者自己设置的ip)。
在这里插入图片描述


然后在终端下启动worker。

celery -A  celery_tasks.tasks worker -l info 

这个命令会启动一个worker来执行task。执行完这条命令后,不出意外的出现下面这个界面的话表示worker已经启动成功,正在等待执行任务。
在这里插入图片描述

我的发邮件功能用到celery


但是在中间遇到了一个bug

在这里插入图片描述
看了半天大致了解到

是celery 运行时 需要 读取django 中的信息

所以又在tasks下 加了下面的代码:

import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
django.setup()

在这里插入图片描述

又运行 发现可以了


还有一个bug

MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留。可能修改数据集的命令被禁用。请检查Redis日志,了解有关错误的详细信息

解决方法----点击进入:

关键代码:

config set stop-writes-on-bgsave-error no

总结:

如果你要将你的celery 在另一台电脑上运行
1.将你的项目代码拷贝过去
2.把这个任务加上下面的代码
            # import os
            # import django
            # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
            # django.setup()
3.     celery -A  celery_tasks.tasks worker -l info 
4.django 想要运行  那么安装的所有的包  都得拷贝过去  
5.步骤 先将本地导出,再在另一台电脑 一次性 安装
6.pip freeze > ~/dailyfresh.txt
7.pip install -r ~/dailyfresh.txt -i xx xxxxxx
8.如果你的任务运行时间比较长   用celery进行异步执行
9.celery  还有一个定时器的功能    time.sleep()
10.celery 运行时 需要 读取django 中的信息  
    所以要在任务下买你加上2中的代码   
    否则报错
    django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_BACKEND, 
    but settings are not configured. You must either define the environment variable 
    DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
11.运行前 需要 启动redis  服务 因为redis 是数据库

猜你喜欢

转载自blog.csdn.net/wem603947175/article/details/83063931