问一下, 用 flask 做了一个接口, 接收请求生成一个 shell 任务,任务执行时间会很长, 所以不等待执行完成直接返回请求. 这个应该怎么实现呢? 有什么好的实践吗?

2019-09-05 16:24:57 +08:00
 aieike
5287 次点击
所在节点    Python
29 条回复
lolizeppelin
2019-09-05 21:42:47 +08:00
@aieike

自己 google 一下
你执行的 shell 函数,最终实现是 fork 了一次,阻塞 wait,所以卡住
改成 fork 两次,直接 os._exit(0), 给 pid 1 接管你的子进程就是
这和写守护进程的原理是一样的

所有的外部进程调用都是 fork exec 的组合,这是 linux 编程基础,只盯着 python 自然一头雾水
tfdetang
2019-09-06 10:06:06 +08:00
from concurrent.futures import ThreadPoolExecutor 这个应该是最简单的解决方案了,随便搜一下就知道怎么用
aieike
2019-09-06 10:26:31 +08:00
@labulaka521
@aneureka
好的我去了解一下这个扩展
aieike
2019-09-06 10:26:54 +08:00
cigarzh
2019-09-06 14:00:01 +08:00
fork and exec +1
wzwwzw
2019-09-06 14:06:33 +08:00
subprocess.Popen
x66
2019-09-06 14:40:34 +08:00
subprocess.Popen('/path/shell.sh')
ytymf
2019-09-06 15:56:18 +08:00
任务队列是正道,如果觉得 celery 麻烦,可以试试轻量化的 Huey,redis 默认配置就能跑
nullboy
2020-03-30 10:51:51 +08:00

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

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

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

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

© 2021 V2EX