9

fastapi 收到一个 http 请求后,就创建一个新的 Thread,去执行一个机器学习模型代码...

 2 years ago
source link: https://www.v2ex.com/t/811955
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Python

fastapi 收到一个 http 请求后,就创建一个新的 Thread,去执行一个机器学习模型代码,这块代码是我不懂也不可控的。我想知道有没有办法,可以控制杀死这个线程及所有相关的线程。

  zxCoder · 37 分钟前 · 141 次点击

这个模型代码单独运行时,如果我按 ctlr+C 停止的话,都很难直接停下来,里头好像有用到多线程啥的,反正太深层了看不懂。

以至于套到 fastapi 上之后,如果已经触发在跑这个模型了,我直接关掉 fastapi 程序也很难,ctlr+C 通常是关不了,只能直接 kill 。

有没有什么好一点的方法呢,可以让这个正在跑的 Thread 不管三七二十一,就给停下来,删掉。

4 条回复    2021-10-31 23:07:51 +08:00

leimao

leimao   24 分钟前 via iPhone

Kill thread 很难,似乎很少有办法。Kill process 可以,只要知道 PID 就行了。可以尝试一下和下面 Kill distributed training 类似的思路。
https://leimao.github.io/blog/Kill-PyTorch-Distributed-Training-Processes/

ipwx

ipwx   19 分钟前

对,用 多进程,直接 os.kill

feiandxs

feiandxs   18 分钟前

fastapi 跑一个 api ,作为触发没问题,但我不建议直接在 fastapi 里调用。 是我的话我宁愿接个 celery 或者更简单的做个实现,来告知有个任务,然后由别的运行服务来进行对模型的调用。

并且对这样的模型的调用我也不觉得直接调用好,应该关进一个笼子里,笼子本身对资源占用,对进程管理做更好的管控。 其实我看你也就是想要这样的东西。

有个想法,其实可以用 py 来调 shell ,shell 来干这个杀的事。。。

ClericPy

ClericPy   10 分钟前

接 celery 就太多不可控的东西了...

python 和多数语言一样线程是系统那边原生的, 很难杀死, 如果不嫌麻烦就丢到 Serverless 上?

嫌麻烦的话, 如果 fastapi 启动线程也用的 run_in_executor 那个, 用的时候用多进程那个 ProcessExecutor 就可以杀了(不过没试过 cancel 掉的时候会不会杀掉, 一般 INTSIG 会一路传递过去), 一般状态切换不频繁的多进程实际没多大开销, 应该能满足你.

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK