美文网首页
Django中如何使用django-celery完成异步任务 (

Django中如何使用django-celery完成异步任务 (

作者: 阳光小镇少爷 | 来源:发表于2017-04-20 09:55 被阅读0次

    在上一篇博文中, 我们介绍了如何在开发环境中使用Celery. 接下来我们介绍一下如何在部署环境使用Celery.

    1. 简单设置

    一个简单的Celery堆有一个queue和一个worker进程组成. 使用以下命令启动worker:

    python manage.py celery worker -B

    以上命令是基于django-celery, 当然你也可以celery自身启动worker. 通常我们使用supervisord管理celery worker的启动和重启, 而不是使用手动的方式. supervisord的介绍我们会在今后的文章中作详细介绍. 现在我们只需要知道它是一款进程管理程序即可. 当然, 你也可以选择类似的系统, 例如init.d, upstart, runit或god等.

    "-B"参数告诉celery在启动worker时同时启动celery beat, 并使用统一进程, 以便执行定期任务.

    在部署服务器上, 我们使用Redis或RabbitMQ作为broker. 而在这一简单的celery堆中, 我们用django数据库储存执行结果, 或干脆忽略结果都可.

    2. 完整设置

    如果简单设置无法满足我们的需要的话, 我们只需要做一些简单的改变就能完整设置Celery异步任务. 完整设置中, 我们使用多个queue来区分任务优先级. 每个queue我们配置一个不同concurrency设置的worker. beat进程也与worker进程分离出来.

    # 默认 queuepython manage.py celery worker -Q celery# 高优先级 queue. 10个 workerspython manage.py celery worker -Q high -c10# 低优先级 queue. 2个 workerspython manage.py celery worker -Q low -c2# Beat 进程python manage.py celery beat

    注意, 其中high和low只是queue的名字, 并没有其他特殊意义. 我们通过为高优先级的queue配置高concurrency的worker, 使高优先级queue能够使用更多的资源.

    同样的, 这些启动命令通过supervisor管理. 至于broker, 我们还是使用Redis或RabbitMQ. 而任务结果则可以储存在Redis或Memcached这些拥有高写入速度的系统中. 如果有必要, 这些worker进程可以移到其他服务器中, 但最好共享一个broker和结果储存系统.

    3. 扩展性

    我们不能一味的依靠增加额外的worker来提高性能, 因为每个worker都会占用一定的资源. 默认的concurrency设置是, 都多少CPU便创建多少worker, 并为每个worker创建一个新的进程. 将concurrency设置的太高则会很快的榨干服务器的CPU和内存资源.

    对于I/O资源需求较大的任务, 我们则可以指定worker使用gevent或eventlet池, 而不是使用更多进程. 这一配置使用的内存资源会大大降低, 同时提升concurrency的性能. 需要注意的是, 但如果我们涉及到的library没有为greenlet打过补丁的话, 很有可能会阻塞所有的任务!

    4. 注意

    还有需要注意的是django的transaction. transaction根据django的版本和是否已web request形式传入有所不同, 所以你需要自己查阅相关的文档.

    原文链接: http://www.weiguda.com/blog/74/

    相关文章

      网友评论

          本文标题:Django中如何使用django-celery完成异步任务 (

          本文链接:https://www.haomeiwen.com/subject/xwbkzttx.html