还在用老掉牙的Python分布式任务队列Celery? 换Dramatiq试试。
有多年专业 celery 使用经验的罗马尼亚工程师 Bogdan Popa 觉得 Celery 就是个大烂坑。于是又发明了个 python 异步任务框架轮子 dramatiq
https://dramatiq.io/motivation.html
受到 sidekiq 的启发。对标 celery 和 python-rq (redi queue)
还在用老掉牙的Python分布式任务队列Celery? 换Dramatiq试试。
不错, 好东西
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。
名字起的不太好…
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 去处理异步任务?
我 GitHub 重新整理了一下,把 dramatiq-gevent 的测试,和多进程协程测试的情况加了进去
celery 确实是坑,各种未解决 bug,直接报错报到 celery 本身的代码错误,比如这个未解决的问题,https://github.com/celery/celery/issues/3773
看上去就是连接已断开的问题。


