V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2019-08-06 10:19:30 +08:00 · 2548 次点击
    这是一个创建于 1961 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求:
    1.在客户端使用 celery 的时候,将 celery 的任务使用 redis.lpush 存储到 redis 中(比如发送短信或者邮箱)
    2.自己封装一个 celery 服务,将该 celery 服务跑在一个端口,使用 redis 的 rpop 实时监控是否有任务存在,如果有则处理
    不知道我描述的够不够清楚,我现在不知道这个轮子应该怎么写,大家有没有之后的 demo 可以借鉴下啊
    
    16 条回复    2019-08-08 17:39:16 +08:00
    SingeeKing
        1
    SingeeKing  
       2019-08-06 10:21:28 +08:00
    你是不是对 Celery 有误解…… 它本身就可以自动监控是否有任务并处理,而且也可以用 Redis 做消息队列啊
    37Y37
        2
    37Y37  
       2019-08-06 10:25:08 +08:00
    celery 本身就是个异步处理框架,都帮你做好了,你只需要用就行了,不用关心 redis 队列,使用可参考:
    https://ops-coffee.cn/s/lXrp3igYo9W2UuE5Gauysg
    kayseen
        3
    kayseen  
    OP
       2019-08-06 10:26:27 +08:00
    @SingeeKing 我知道你的意思,但是现在需求就是写一个通用的 celery 服务,就是你在项目中使用到 celery 的时候,只往 redis 中存任务,你封装的 celery 就是时刻监控 redis 中的任务...通俗点把 celery 单独提出来写个服务
    leishi1313
        4
    leishi1313  
       2019-08-06 10:29:38 +08:00
    还是跟其他几楼一样,celery 本来就是这么用的啊。或者针对 redis,有其他的轮子也可以用:python-rq.org
    SingeeKing
        5
    SingeeKing  
       2019-08-06 10:42:18 +08:00
    意义何在啊,你这本身就是重复造了个 Celery 啊

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

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


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