求助,求推荐 celery 的轻量级替代方案

2020-06-02 17:17:34 +08:00
 chaleaoch
特别简单的一个需求.
django view 里面非阻塞调用一个第三方的 api. 然后将返回值作为参数调用 callback.
view 里面直接返回 response 调用成功(第三方 api 返回什么无所谓).

类似于发送短信验证码一样的需求.

用 celery 太重了.
起个线程有问题吗?需要注意什么吗?
6598 次点击
所在节点    Python
36 条回复
ClericPy
2020-06-02 22:41:06 +08:00
这种量级没什么必要走消息队列吧
这就个位数的任务, 也不用非得启动 celery 那么重吧
最最简单的, 生产者消费者模式:
启动服务的时候丢一个多线程后台跑着消费 Python 自带的 queue, 然后 api 被调用的时候把相关参数传入 queue 里去, 又线程安全, 又避免高并发出问题(可以加个 sleep 避免触及第三方 api 的 rate limit)
如果需要并发, 那这个 background 就可以换成 thread executor, api 被调用的时候无脑给 pool 里 Submit 一个函数+参数就可以异步启动了

不过如果 Django 经常要重启, 这就没法持久化 Callback 的参数了, 确实该用 celery 或者消息队列...
youngce
2020-06-02 22:49:00 +08:00
我的 celery 安安静静的跑了有一整年了,暂时没有看出啥问题。。。动态修改周期性任务执行计划还是挺香的
HuberyPang
2020-06-02 22:51:35 +08:00
@ericls 老哥,请教下。django view 中启动线程,怎么配置线程池啊。每一次请求 view,就是开启了一个线程(我这么说没错吧),那么当线程池用完了,这时在有访问 view,会阻塞吗
aladdindingding
2020-06-02 22:57:55 +08:00
单独起一个线程就好了
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(5)

executor.submit()立马就有返回的 不会阻塞
HuberyPang
2020-06-02 23:20:23 +08:00
![测试了下,不会阻塞,就是还不是很懂这里的原因]( https://pic.downk.cc/item/5ed66dc0c2a9a83be5fa40d6.jpg)
tulongtou
2020-06-02 23:30:29 +08:00
我这 celery + rabbitmq 跑了 5 年多了,从 python2 跑到 python3,一直很好用啊,没感觉有多重
Ritter
2020-06-03 00:02:02 +08:00
rq
iConnect
2020-06-03 00:23:51 +08:00
@tulongtou
@youngce

celery 这么稳吗?我用过感觉每隔几个星期就假死一次 celery+redis
gjquoiai
2020-06-03 00:44:24 +08:00
dramatiq
ericls
2020-06-03 00:59:25 +08:00
@HuberyPang 在 wsgi/asgi 入口附近起线程池 在 view 里面使用线程池。

django 的 view 没有在线程池里面,是在主线程的
skywatcher
2020-06-03 01:43:22 +08:00
需求简单,但是看你要不要满足高可用。比如任务失败是否重试,任务丢失能否接受(机器挂了,服务重启了)。项目不大能简单切换,可考虑用异步 io 框架,应该都不需要线程池,框架本身支持,比如 tornado, fastapi 。Django 的话启动 http server 时启动一个线程池,在 api 调用时使用线程池执行即可。再者如果任务比较多,线程池有压力,可以考虑额外启动几个消费进程与 http 服务进程共享 queue,用 queue 来分发任务,消费进程获取任务执行。如果你要考虑到任务的管理(失败重试、任务不丢失、任务状态),那就考虑 celery,mq 等中间件
Trim21
2020-06-03 01:55:24 +08:00
@iConnect Redis 会假死,amqp 不会
Ehco1996
2020-06-03 06:44:53 +08:00
@ClericPy 我猜需求是不想在开一个进程去异步的做任务。让所有的事情都通过 django 自己干
jswh
2020-06-03 09:55:31 +08:00
起个线程自己做一下好了,反正是 python,又不是 PHP
ytymf
2020-06-03 15:24:34 +08:00
Huey,很小很稳。定时异步都支持。。。。
macrosea
2021-04-23 23:43:51 +08:00
围观

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/677927

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX