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