新手 django 。 现在情况这样,用户前端点击按钮,后台收到请求会进行一个长时间的操作( 5 分钟左右)。中间还要返回完成进度。 我看说异步操作用 celery 。但是那个 worker 貌似不能太多。比如只有四个 worker,是不是超过四个请求再进来的也得排队。 这种是不是得用线程操作。自己实现类似 celery 的样子,开启一个线程时候生成一个唯一 id,反给前端,线程根据这个 id 把中间步骤完成情况放到 redis 。前端通过这个 id 去查找完成状态。 有没有更适合的解决方法。 这个小项目是个内部演示 demo 。如果有老 django 朋友有时间,可以留下联系方式,外包出去。项目不对外只是对领导演示功能。
1
lllllliu 2021-09-24 09:34:34 +08:00
生产者 /发布者或者 redis 的 pub/sub 也可以快速简单的实现。
至于通知可以用 socket 主动发送,也可以按照你说的通过 job id 轮训状态。 |
2
leopardwei 2021-09-24 09:39:48 +08:00
celery 能满足你的需求,仔细看文档,不用再去重复造轮子了。
|
3
wzwwzw 2021-09-24 09:41:20 +08:00
如果处理不完是要排队的,排队要好于你开线程,线程开太多的话,服务器承受不住的。
|
4
chaleaoch 2021-09-24 09:42:49 +08:00
websocket.
|
5
hope4tomorrow 2021-09-24 09:42:54 +08:00
绿色 cGxhaW5xaW5obA==
|
6
hope4tomorrow 2021-09-24 09:44:21 +08:00
采用 celery 的机制没有问题,如果 5 分钟的开销减少不了,可以做成离线任务,让进度显出出来,可以感知到
|
7
fml87 2021-09-24 09:50:55 +08:00
worker 可以用协程跑啊 celery -A project -c 100 -P gevent --time-limit=600
也支持路由、优先级之类的配置,多看看文档 |
8
E520 2021-09-24 10:01:26 +08:00
websocket
|
9
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,稳定性还可以。 |
10
izoabr 2021-09-24 10:03:51 +08:00
@izoabr #9 而且可以运行多个实例起来,可以有专门用来跑 Thread 的实例,用一套数据库配置就行,这样就不会多占用 web 端的资源
|
11
coolair 2021-09-24 10:44:44 +08:00
|
12
neoblackcap 2021-09-24 11:33:02 +08:00
WX: bmVvX2JsYWNrY2Fw
|
13
Aprilming 2021-09-24 13:01:36 +08:00
嘿嘿,几乎相同的业务逻辑,我的可能不是五分钟,而是 1 小时左右,用 celery+websocket, 轻松完成。
|
14
chenqh 2021-09-24 13:48:49 +08:00
你这种大进程数开多点也没有问题吧
|
15
chenqh 2021-09-24 13:50:11 +08:00
你这种长时间任务可能要考虑的是如果 celery 重启或者代码更新导致 celery 重启了怎么办
|
16
dicc 2021-09-24 15:39:43 +08:00
threading 都能干
|