V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kayseen
V2EX  ›  Python

Python 封装通过的 celery 服务

  •  
  •   kayseen · Aug 6, 2019 · 3287 views
    This topic created in 2459 days ago, the information mentioned may be changed or developed.
    需求:
    1.在客户端使用 celery 的时候,将 celery 的任务使用 redis.lpush 存储到 redis 中(比如发送短信或者邮箱)
    2.自己封装一个 celery 服务,将该 celery 服务跑在一个端口,使用 redis 的 rpop 实时监控是否有任务存在,如果有则处理
    不知道我描述的够不够清楚,我现在不知道这个轮子应该怎么写,大家有没有之后的 demo 可以借鉴下啊
    
    16 replies    2019-08-08 17:39:16 +08:00
    SingeeKing
        1
    SingeeKing  
    PRO
       Aug 6, 2019
    你是不是对 Celery 有误解…… 它本身就可以自动监控是否有任务并处理,而且也可以用 Redis 做消息队列啊
    37Y37
        2
    37Y37  
       Aug 6, 2019
    celery 本身就是个异步处理框架,都帮你做好了,你只需要用就行了,不用关心 redis 队列,使用可参考:
    https://ops-coffee.cn/s/lXrp3igYo9W2UuE5Gauysg
    kayseen
        3
    kayseen  
    OP
       Aug 6, 2019
    @SingeeKing 我知道你的意思,但是现在需求就是写一个通用的 celery 服务,就是你在项目中使用到 celery 的时候,只往 redis 中存任务,你封装的 celery 就是时刻监控 redis 中的任务...通俗点把 celery 单独提出来写个服务
    leishi1313
        4
    leishi1313  
       Aug 6, 2019
    还是跟其他几楼一样,celery 本来就是这么用的啊。或者针对 redis,有其他的轮子也可以用:python-rq.org
    SingeeKing
        5
    SingeeKing  
    PRO
       Aug 6, 2019
    意义何在啊,你这本身就是重复造了个 Celery 啊

    你可以理解为 Celery 是一个消息队列的处理器、Redis 是一个消息队列; Celery 本身的作用就是「将任务存到 Redis 中」和「实时监控是否有任务存在,如果有则处理」,所以你现在的需求就是自己造一个 Celery

    那么。。回复你的问题:Celery 就是你要的 demo
    est
        6
    est  
       Aug 6, 2019
    额。。。。。
    ynkkdev
        7
    ynkkdev  
       Aug 6, 2019
    你的问题,就好比现在你已经有一个轮子了,你只看到了轮胎,想着自己还要做个轮毂,殊不知人家轮胎里,已经包好了一个豪华轮毂了
    AllenBigBear
        8
    AllenBigBear  
       Aug 6, 2019
    @37Y37 我也关注了你的公众号,有些问题想借楼问一下,我最近在部署 django 2.0,配合 supervisor,celery 4,gunicorn 和 redis


    部署的服务器是 1C1G5M 的良心云
    然后我如果 supervisor 里面单独启动 gunicorn (也就是只运行 django ),加载速度没问题
    但是如果我一并启动了 celery,服务器就一下子超卡。。
    不知道有没有碰到过类似的问题?谢谢!
    est
        9
    est  
       Aug 6, 2019
    @youngce celery 本身就是轮子套轮子。。比如 RabbitMQ 这个其实本身功能就够强大了。celery 自作聪明套了一层。。
    arrow8899
        10
    arrow8899  
       Aug 6, 2019
    django 开放一个 API 出来就行了,导入 django-celery 模块,调用这个 API 就可以往 celery 里写入任务,没必要再去加一层 redis。
    ynkkdev
        11
    ynkkdev  
       Aug 6, 2019
    @est 还行吧,毕竟 celery 也是支持用 redis 作为消息队列的,当初我对 RabbitMQ 不怎么了解的时候,项目里已经有了 redis,就直接 celery+redis 一把梭了。现在看起来的话,确实还有有很多可以改进的地方- -
    lolizeppelin
        12
    lolizeppelin  
       Aug 6, 2019
    请使用 oslo.messaging
    smallpython
        13
    smallpython  
       Aug 6, 2019
    楼上并没有在解决问题啊
    我的理解
    你说的客户端发送任务,服务器接收任务
    其实就是客户端把任务放到消息队列里,那么你的服务端就不需要开什么服务端口
    只需要 redis 端口开放出来就可以了
    想要实现这个功能只需要客户端和服务器的任务名称一样,指定的消息队列一样,剩下的 celery 会自动调度任务
    wd
        14
    wd  
       Aug 6, 2019 via iPhone
    @kayseen #3 celery 是可以独立运作的 看你说的是想自己往 broker 发消息应该也是可以的 可能需要你自己去看看实现的逻辑
    c9106
        15
    c9106  
       Aug 7, 2019
    朋友,celery flower 已经有 api 在那里了,只是简单了点,可以自己扩展
    fansfans
        16
    fansfans  
       Aug 8, 2019
    @smallpython 跟我想说的差不多,但是需要在客户端创建同样的任务名称 然后调用,虽然这个任务不需要实现,但是感觉还是会很鸡肋 。如果模拟 TaskProducer.publish_task 的实现 应该可以达到发送函数名执行的效果
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2753 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 13:17 · PVG 21:17 · LAX 06:17 · JFK 09:17
    ♥ Do have faith in what you're doing.