django+celery的使用详细说明

本文详细介绍了如何在Windows环境下安装和配置RabbitMQ作为消息队列,并结合Celery实现异步任务处理,包括普通任务、周期性任务和定时任务的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、rabbitmq的安装
   
   rabbitmq是celery常用的broker之一,它的角色是消息队列。
  
   1. 安装依赖的erlang语言开发包

   安装程序:otp_win32_R16B03-1.exe
   
   安装说明:在win7下建议默认安装,安装完后,
   
             设置环境变量,例如ERLANG_HOME=C:\Program Files\erl5.10.4,
	     
	     添加到PATH中,PATH=%ERLANG_HOME%\bin

   2. 安装rabbitmq

   安装程序:rabbitmq-server-3.2.4.exe
   
   安装说明:安装成功后设置环境变量,例如RABBITMQ_SERVER=C:\Program Files\RabbitMQ Server\rabbitmq_server-3.2.4
             
	     添加到PATH中, PATH=%RABBITMQ_SERVER%\sbin 
   
	     进入%RABBITMQ_SERVER%\sbin目录,执行rabbitmq-plugins enable rabbitmq_management
	     
             最后执行下面3行命令
	      
	     rabbitmq-service.bat stop

	     rabbitmq-service.bat install

	     rabbitmq-service.bat start

   3. 测试安装

   浏览器中输入http://localhost:15672/#/ 默认账号:guest, 密码guest。登陆成功后,表示rabbitmq安装成功。


二、celery的包安装

    celery是一个异步任务队列/基于分布式消息传递的作业队列,以python语言实现,正在被广泛应用,每天处理数以百万计的任务。

    结合django,需要安装两个包:celery和django-celery。命令python setup.py install.

    1. celery安装(依赖包见"celery安装依赖包.rar"中)
    
     首先安装依赖包,顺序为anyjson-0.3.3->py-amqp-3.3.0.30->kombu-3.0.26->billiard-3.3.0.30->pytz-2015.4
     
     最后安装celery-3.118
    
    2. djcelery安装
      
     直接安装django-celery-3.1.16


ps:由于安装了新的python包,如果以eclipse开发的话,记得在eclipse下重新配置下python环境。如果遇到问题,请联系蓝鲸助手!!


具体的celery使用请参考《django+celery的使用介绍》

django+celery的使用介绍

celery是一个异步任务队列/基于分布式消息传递的作业队列,它可以支持很多任务类型,例如普通任务,周期性任务,定时任务等。有兴趣的读者可以参阅官方文档http://docs.celeryproject.org/en/latest/index.html,本文档只介绍常用的几类。ps: celery的相关配置,请参考“APP开发框架”中的settings部分。
一、普通后台任务
后台任务通过将同步请求异步化,可以有效地解决请求超时的问题。
示例场景:app有一个执行任务的请求,该任务执行比较耗时。
Example:
在这里插入图片描述
图1.1 普通任务样例
如图1.1的代码片段,调用custom_task.apply_async(args=[param1, param2])时,不会立即执行custom_task函数,而是向消息队列中插入一条相关的任务元数据,接着程序会立即执行return操作。同时,celery服务端会从消息队列中取出这条元数据并执行custom_task。这样就实现了耗时任务的异步化,空闲出了uwsgi的worker资源。
本地开发时celery的启动方法:

python  manage.py  celery  worker  --settings=settings

二、周期性任务
周期性任务是较为常见的后台任务,例如周期地推送消息,周期地清理日志等。 celery的周期性任务用法类似于linux的crontab任务。由于它是应用层面的,可用性更灵活,用户可以通过简单的配置数据库,就可以管理周期性任务了。
示例场景:定期清理日志文件。
Example:
在这里插入图片描述
图2.1 周期性任务示例
如图2.1中的代码片段,clean_log1会在celery beat启动后,自动注册到数据库中(CELERYBEAT_SCHEDULER = “djcelery.schedulers.DatabaseScheduler”)。clean_log2则需要手动配置到库中(开发框架中提供了api接口来直接操作数据库)。区别在于两个装饰器的作用不同,@task是通用的,而@periodic_task是针对周期性任务的,参数run_every设置了周期crontab。crontab设置规则类似于linux系统的crontab,如图2.2所示。具体的配置可以参考http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html 。
在这里插入图片描述
图2.2 crontab配置示例
*配置出周期性任务:
celery执行周期性任务的一大优势是可配置性,即不修改原有代码,就可以方便的调整任务的调度规则和关闭任务等。和app的自定义model管理方式一样,Djcelery库也可以通过admin页面管理,如图2.3,它是Djcelery的库,其中Crontabs和Interval是配置调度规则的,Periodic tasks是配置任务的。强调一点,这里的任务都需要在代码中用装饰器@task或者@periodic_task包装,否则是无效的。
点击Periodic tasks后,如图2.4,celery beat启动后,自动注册了clean_log1任务。如果需要将clean_log2配置成周期性任务,可以通过配置Crontabs
在这里插入图片描述
图2.3 Djcelery管理
在这里插入图片描述
图2.4 periodic task子表
和Periodic tasks实现。同时,平台也提供了对应的api方便开发者使用。图2.5是一个配置示例,其中Task是注册上clean_log2, Crontab选择的是每3分钟执行一次。
在这里插入图片描述
图2.5 clean_log2的配置示例
本地开发时celery的启动方法:

python  manage.py  celery  worker  --settings=settings
python  manage.py  celerybeat --settings=settings

三、定时任务
指定定时的时间点,执行某个任务。
示例场景:定时发送邮件。
Example:
在这里插入图片描述
图3.1 定时任务示例
图3.1中给出了调用定时任务的两种例子,countdown=60和eta=datetime.now()+timedelta(seconds=60)都是设置send_email_task在60s后执行。
本地开发时celery的启动方法:

python  manage.py  celery  worker  --settings=settings

celery的更多用法可参考官方文档,目前平台未提供通用的result backends服务,因此部分高级用法可能在平台无效(例如chord等)。

周期任务代码范例:

# ===============================================================================
# 周期异步任务:更新搜索引擎索引
# ===============================================================================
@task(ignore_result=True)
def update_index():
    """
    定义一个 更新索引更新的 celery 异步任务
    """
    logger.info('--------------更新索引开始--------------')
    from haystack.management.commands import update_index
    update_index.Command().handle()
    logger.info('--------------更新索引结束--------------')


def execute_task():
    """
    执行 celery 异步任务

    调用celery任务方法:
        task.delay(arg1, arg2, kwarg1='x', kwarg2='y')
        task.apply_async(args=[arg1, arg2], kwargs={'kwarg1': 'x', 'kwarg2': 'y'})
        delay(): 简便方法,类似调用普通函数
        apply_async(): 设置celery的额外执行选项时必须使用该方法,如定时(eta)等
                      详见 :http://celery.readthedocs.org/en/latest/userguide/calling.html
    """
    now = datetime.datetime.now()

    # logger.error(u"celery 定时任务启动,将在60s后执行,当前时间:{}".format(now))

    # logger.error(u"celery 定时任务启动,将在60s后执行,当前时间:{}".format(now))

    # 调用定时任务
    update_index.apply_async(args=[], )
    return HttpResponse()


@periodic_task(run_every=crontab(minute='*/1', hour='*', day_of_week="*"))
def get_time():
    """
    celery 周期任务示例

    run_every=crontab(minute='*/5', hour='*', day_of_week="*"):每 5 分钟执行一次任务
    periodic_task:程序运行时自动触发周期任务
    """
    execute_task()
    # now = datetime.datetime.now()
    # logger.error(u"celery 周期任务调用成功,当前时间:{}".format(now))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值