除去 Celery 的话,还有其他的办法么?
1
iConnect 2020-02-28 13:59:57 +08:00 via Android
async 在一个线程里可以,thread 也可以在多个线程里
|
3
Livid MOD 如果你可以说一下具体的应用场景,然后可能会有其他解决方法。
|
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 那么你可能需要这样来实现它:
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 |
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 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 这个东西,看了下代码应该是有个单独的线程在处理队列里的东西
|