作为一名算法…哦不对,是调参工程师,在日常调参之外,偶尔也需要把模型整成一个http服务对外支持,而在这里面最烦的就是业务方要求要大量的并发请求,以及实时性。这时候就会涉及到一些多进程,多线程,协程,异步非阻塞等等概念。这里记录一下自己对这些概念的理解,以及如何将自己的程序耗时缩减到最小。

概念篇

1. 线程、进程、协程

进程:对于操作系统而言,进程是最小的资源管理单元。假设有两个任务A和B,当A遇到了一个很复杂的IO操作,此时CPU只能等待A读写完后,再去执行B任务。因此这样会对CPU的资源造成极大的浪费,而一种高效的执行方式是,让A在进行IO操作时,将CPU切换给B执行,当A读取完数据后,再将CPU切换回给任务A。而这就涉及到任务的切换,任务状态的恢复,以及任务所需的系统资源等等。此时就需要一个去记录这些东西,因此进程就被设计出来,计算机通过进程去识别任务,分配调度任务系统资源。而进程的状态的记录、恢复、切换被称之为上下文切换

线程:对于操作系统而言,线程是最小的执行单元。假设我们有一个文本程序,需要接受键盘输入,将输入内容显示到屏幕,还要把内容保存到硬盘中,如果我们只有一个进程,那么我们在同一个时间就只能做一件事情,比如当在接收键盘输入时,我们就不能将内容保存到硬盘中。如果我们采用多进程来做,比如创建三个进程来分别负责这三个任务,这个时候就会涉及到文本内容的共享问题,而我们太频繁的去切换进程就会造成性能上的损失。因此线程就被设计出来,在python中线程是共享内存的,也就是线程能访问到程序中的所有变量。这是线程的最大优势,也是线程中最大的劣势。为什么这么说呢?后面谈到全局解释器锁GIL)再进一步解释。

协程