咨询个 django 处理耗时任务的问题,顺便找个兼职完成个 demo

2021-09-24 09:22:37 +08:00
 dearmymy

新手 django 。 现在情况这样,用户前端点击按钮,后台收到请求会进行一个长时间的操作( 5 分钟左右)。中间还要返回完成进度。 我看说异步操作用 celery 。但是那个 worker 貌似不能太多。比如只有四个 worker,是不是超过四个请求再进来的也得排队。 这种是不是得用线程操作。自己实现类似 celery 的样子,开启一个线程时候生成一个唯一 id,反给前端,线程根据这个 id 把中间步骤完成情况放到 redis 。前端通过这个 id 去查找完成状态。 有没有更适合的解决方法。 这个小项目是个内部演示 demo 。如果有老 django 朋友有时间,可以留下联系方式,外包出去。项目不对外只是对领导演示功能。

2915 次点击
所在节点    Django
16 条回复
lllllliu
2021-09-24 09:34:34 +08:00
生产者 /发布者或者 redis 的 pub/sub 也可以快速简单的实现。
至于通知可以用 socket 主动发送,也可以按照你说的通过 job id 轮训状态。
leopardwei
2021-09-24 09:39:48 +08:00
celery 能满足你的需求,仔细看文档,不用再去重复造轮子了。
wzwwzw
2021-09-24 09:41:20 +08:00
如果处理不完是要排队的,排队要好于你开线程,线程开太多的话,服务器承受不住的。
chaleaoch
2021-09-24 09:42:49 +08:00
websocket.
hope4tomorrow
2021-09-24 09:42:54 +08:00
绿色 cGxhaW5xaW5obA==
hope4tomorrow
2021-09-24 09:44:21 +08:00
采用 celery 的机制没有问题,如果 5 分钟的开销减少不了,可以做成离线任务,让进度显出出来,可以感知到
fml87
2021-09-24 09:50:55 +08:00
worker 可以用协程跑啊 celery -A project -c 100 -P gevent --time-limit=600

也支持路由、优先级之类的配置,多看看文档
E520
2021-09-24 10:01:26 +08:00
websocket
izoabr
2021-09-24 10:02:31 +08:00
上次好像想过用 celery,但是好像因为 Python 版本问题最后没用它。
所以我是在 AppConfig 里抛几个 Thread 出来去监听 MQ 队列,这样 Thread 池的大小可以自定义,我开了 10 个。
request 有任务需求的时候,通过发消息到 MQ 去,Thread 消费消息开始任务,做完了,按照消息里约定的 routing key 发布消息去 MQ,前端通过 mqtt 或者 websocket 消费消息。

这样基本上就是一个 MQ Server 就够

Python 的 MQ 客户端之前用 pika,连的 RabbitMQ 后来发现稳定性很不好,现在用 amqpstorm,稳定性还可以。
izoabr
2021-09-24 10:03:51 +08:00
@izoabr #9 而且可以运行多个实例起来,可以有专门用来跑 Thread 的实例,用一套数据库配置就行,这样就不会多占用 web 端的资源
coolair
2021-09-24 10:44:44 +08:00
neoblackcap
2021-09-24 11:33:02 +08:00
WX: bmVvX2JsYWNrY2Fw
Aprilming
2021-09-24 13:01:36 +08:00
嘿嘿,几乎相同的业务逻辑,我的可能不是五分钟,而是 1 小时左右,用 celery+websocket, 轻松完成。
chenqh
2021-09-24 13:48:49 +08:00
你这种大进程数开多点也没有问题吧
chenqh
2021-09-24 13:50:11 +08:00
你这种长时间任务可能要考虑的是如果 celery 重启或者代码更新导致 celery 重启了怎么办
dicc
2021-09-24 15:39:43 +08:00
threading 都能干

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

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

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

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

© 2021 V2EX