
除去 Celery 的话,还有其他的办法么?
1 iConnect 2020-02-28 13:59:57 +08:00 via Android async 在一个线程里可以,thread 也可以在多个线程里 |
3 Livid MOD PRO 如果你可以说一下具体的应用场景,然后可能会有其他解决方法。 |
4 qile1 2020-02-28 14:24:44 +08:00 via Android 楼主是不是想,直接返回保存成功,另一个线程后台保存数据到数据库? |
5 btv2bt OP @Livid Windows 环境,API 接收到请求之后(随后告诉请求方参数已收到),根据参数执行一段 cmd 命令,命令执行完后再把结果返回给请求方 |
7 woodensail 2020-02-28 14:30:44 +08:00 感觉是类似长连接的需求啊,这种做法服务端和客户端都得改造,代价太大了。 改用离线计算的方式来实现? |
8 Livid MOD PRO 那么你可能需要这样来实现它: API 收到请求之后,返回一个任务 ID,然后用异步任务去执行,执行完毕之后根据分配的任务 ID 写入结果。 请求方根据任务 ID 发起另外一个或者多个请求去拿结果,在异步任务没有完成之前会拿到「任务还没有执行完毕」,完成之后拿到的就是异步任务写入的结果。 |
9 cominghome 2020-02-28 14:36:49 +08:00 站长的方式靠谱。典型的异步任务流程。 |
10 btv2bt OP |
11 btv2bt OP |
12 woodensail 2020-02-28 14:41:28 +08:00 站长给离线计算的方案了,另外就是注意离线计算结果的保存和销毁策略。可以考虑比如定时 1 小时销毁;或者按账号,每个账号只保留最新的一个计算结果。 |
13 Livid MOD PRO |
14 mimzy 2020-02-28 14:50:00 +08:00 有类似场景,用了 Celery,前端轮询结果,感觉轮询这里不太优雅 |
15 fengshils 2020-02-28 14:50:06 +08:00 使用 celery 返回任务 id,在定时去拿结果可好 |
16 est 2020-02-28 14:52:12 +08:00 具体是可以不用其他库实现的。 但是 LZ 说这个需求不对。你要的是浏览器配合。 |
17 676529483 2020-02-28 14:55:58 +08:00 一般都用 celery 做吧,如果用最新的 django3.0,可以考虑下 django_simple_backend 这个库 |
19 btv2bt OP |
20 wuwukai007 &nbs; 2020-02-28 15:10:43 +08:00 via Android 别用 celery 在 windows 上,用了还要在配个 redis,徒增成本 |
21 btv2bt OP |
22 wuwukai007 2020-02-28 15:36:06 +08:00 via Android 曲线一点,用 apscheduler 做异步任务,建张状态表,直接返回前端任务启动成功与否,然后任务里面写状态,前端 api 访问状态,完成后在查表返回结果 |
24 btv2bt OP |
25 robinlovemaggie 2020-02-28 16:01:33 +08:00 参考各大话费充值系统和类银行转账系统的事务模型。 |
26 ytymf 2020-02-28 16:50:05 +08:00 不想用 celery,还有 huey,不过也要 redis |
27 xgq89757 2020-02-29 18:22:59 +08:00 via iPhone @btv2bt 可以用 process_response 这个,django 自带的,执行视图函数结束之后会调用这个 |
28 btv2bt OP @xgq89757 我试了一下重构 response,但还是会阻塞,用了一个第三方库,没这个问题了; process response 的话,会阻塞吗 |
29 bnm965321 2020-03-12 10:18:37 +08:00 重载 response 会堵塞,因为没有释放这个 server 不能继续接客 |
30 btv2bt OP @bnm965321 嗯,用了 after response 这个东西,看了下代码应该是有个单独的线程在处理队列里的东西 |