django+celery的使用详细说明

网友投稿 1076 2022-12-01

django+celery的使用详细说明

django+celery的使用详细说明

一、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. 测试安装 浏览器中输入默认账号: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.16ps:由于安装了新的python包,如果以eclipse开发的话,记得在eclipse下重新配置下python环境。如果遇到问题,请联系蓝鲸助手!!具体的celery使用请参考《django+celery的使用介绍》

django+celery的使用介绍

celery是一个异步任务队列/基于分布式消息传递的作业队列,它可以支持很多任务类型,例如普通任务,周期性任务,定时任务等。有兴趣的读者可以参阅官方文档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所示。具体的配置可以参考。

图2.2 crontab配置示例

*配置出周期性任务:

celery执行周期性任务的一大优势是可配置性,即不修改原有代码,就可以方便的调整任务的调度规则和关闭任务等。和app的自定义model管理方式一样,Djcelery库也可以通过admin页面管理,如图2.3,它是Djcelery的库,其中Crontabs和Interval是配置调度规则的,Periodic tasks是配置任务的。强调一点,这里的任务都需要在代码中用装饰器@task或者@periodic_task包装,否则是无效的。

图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=settingspython manage.py celerybeat --settings=settings

三、定时任务

指定定时的时间点,执行某个任务。

示例场景:定时发送邮件。

Example:

图3.1 定时任务示例

图3.1中给出了调用定时任务的两种例子,countdown=60和eta=datetime.now()+timedelta(secnotallow=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)等 详见 : """ 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))

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:QT所以的类
下一篇:浅析Jmeter多用户token使用问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~