还在用老掉牙的Python分布式任务队列Celery? 换Dramatiq试试。

有多年专业 celery 使用经验的罗马尼亚工程师 Bogdan Popa 觉得 Celery 就是个大烂坑。于是又发明了个 python 异步任务框架轮子 dramatiq

https://dramatiq.io/motivation.html

受到 sidekiq 的启发。对标 celery 和 python-rq (redi queue)
还在用老掉牙的Python分布式任务队列Celery? 换Dramatiq试试。


30 回复

不错, 好东西


Celery确实有点老了,Dramatiq在易用性和性能上确实有不少优势。它用RabbitMQ或Redis做broker,API设计更现代,开箱支持任务优先级、延迟和定时任务,性能也比Celery好不少。

给你个简单的对比代码看看区别:

Celery版:

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def process_data(data):
    # 处理数据
    result = data * 2
    return result

# 调用任务
process_data.delay(10)

Dramatiq版:

import dramatiq
from dramatiq.brokers.redis import RedisBroker

broker = RedisBroker(url="redis://localhost:6379")
dramatiq.set_broker(broker)

@dramatiq.actor
def process_data(data):
    # 处理数据
    result = data * 2
    return result

# 调用任务
process_data.send(10)

Dramatiq的API更直观,装饰器直接明了。启动worker也简单:

dramatiq worker_module

性能方面,Dramatiq用多进程模型,比Celery的prefork模式更高效,内存管理也更好。监控界面比Flower简洁实用,还内置了Prometheus指标。

不过迁移要考虑现有项目复杂度,简单项目换起来快,复杂项目得评估下。

总结:新项目可以优先考虑Dramatiq。

名字起的不太好…

dramatic。。。。不错了

sidekiq 好用的一逼,自从转到 ROR,脱发都少了

#3 原来是酱

不兹次 py2, 差评啊

Actor 模型……怕不是想学 akka

AGPL 的话,你的服务要是依赖了这个库,并且对外提供服务。。那么你的全部代码都要 AGPL 出来

MongoDB 也只是数据库部分用 AGPL,各个语言的 sdk 不是。

一个依赖库用 AGPL 的,还是第一次见到,用 GPL 的都少见,用用 LGPL 还算可以。。

看到 Prometheus Metrics 得友情 +1

协议不友好对洁癖来说有障碍呀,虽然 celery 是很坑

虽然觉得 celery 复杂但是不想换

我觉得恰好相反,不支持 py2 才是好评😁

支持。

问题是服务端代码如果我不开源外界没有办法知道我使用了该组件

居然这么多人觉得 celery 坑,的确 celery 的文档不怎么行。不过功能它倒是蛮强大。比如用 celery 就可以使用 pipeline + 不同类型的 worker 完成很多工作,代码可以简单地在一个地方整合。维护者可以简单地看出是如何被调用的。目前这个项目还是缺少对应的功能。

不知道没关系,等别人知道了你想换的时候已经晚了。

celery 的异步队列是不是每次更新,都要重启整个 Linux 服务器?貌似只重启 uwsgi 经常造成队列假死

搭车问问, pip install -U dramatiq[rabbitmq, watch] 后面跟了个 [] 括号,是什么语法糖

不是,你可以重启对应的 worker。建议你还是使用 systemd 来管理 celery,独立地启动关闭

不支持 py2 是加分项啊!可以主动淘汰 py2

setup 函数里的 extra_requires,按需安装。看看 setuptools 的文档就知道了。

这协议和商业方式才是受到 sidekiq 启发吧

不对。。这协议比 sidekiq 狠啊

纯比速度的话~~未必吧
https://github.com/allenling/magne

这是你自己的轮子?

我没理解错的话,magne 就是同进程用 curio 去 spawn 一个单独的 coroutine 去处理异步任务?

嗯嗯~之前老早就像替掉 celery 了,代码看吐了~~然后测试了一下协程的情况~~

我的思路是:每当有一个任务进来,就 spawn 一个协程去执行,所以基本上可以达到上千个协程”同时”执行~~
要发挥到协程 spawn 很便宜的特性

我 GitHub 重新整理了一下,把 dramatiq-gevent 的测试,和多进程协程测试的情况加了进去

celery 确实是坑,各种未解决 bug,直接报错报到 celery 本身的代码错误,比如这个未解决的问题,https://github.com/celery/celery/issues/3773

看上去就是连接已断开的问题。

回到顶部