跳到正文

进程

Process

中级通用

进程(Process)是操作系统运行一个程序时创建的执行实例,拥有自己的内存空间和进程标识。它让网站服务、后台任务等程序分别运行,便于分配资源和隔离故障;同一个程序也可以同时运行多个进程。

你可能会说:「我想让图片处理在后台单独运行,别把网站接口卡住,也别让它出错时拖垮网站。」

读之前建议先了解

动手看看

进程管理器同一程序:site-server · 每行是一个执行实例
程序 / 独立标识
独立内存 · 条长上限 128 MB
site-serverPID 4201 · 运行中
48 MB
site-server
PID 4202 · 运行中
PID 4202 · 已终止
64 MB
内存已回收
site-serverPID 4203 · 运行中
80 MB
保留已终止记录,方便核对 PID
终止 PID 4202

拖动进程数模拟启动实例,再调整蓝框进程的内存、切换终止开关。看清程序名、PID 和内存条:程序相同,执行实例却各自独立。

同一个 site-server 启动了三个进程。它们运行同一份程序,但各有 PID 和自己的内存空间,不是一个进程的三个名字。

蓝框选中 PID 4202。调整它的内存时,另外两条不会跟着变;这里的条长表示内存用量,不代表内存地址或执行进度。

要点

  1. 1

    运行的是实例,不只是代码

    你写好的服务程序放在磁盘上,还没有处理请求。启动它时,操作系统会创建进程,给它进程标识和运行所需的资源。同一份程序启动两次,通常就是两个不同的进程。

  2. 2

    各有内存,通信需要通道

    进程通常有各自的虚拟内存空间。因为一个进程不能直接把普通变量交给另一个进程,所以网站服务和图片处理进程之间,得通过队列、网络连接等方式传递任务和结果。

  3. 3

    退出之后,内存状态会消失

    进程可能正常结束,也可能因错误而退出。你把待处理订单只存在进程内存里,进程一重启就可能丢失这些记录;需要保留的数据,得写进数据库等持久化存储。

容易混淆的地方

程序是代码及相关文件,进程是它运行起来的一个实例;同一程序可以对应多个进程。线程则是在进程内部执行工作的单位:同一进程中的线程共享该进程的内存,而不同进程通常不能直接共享普通变量。你说“再开一个线程”和“再开一个进程”,涉及的资源隔离和通信方式不一样。

什么时候用

适合用

  • 网站接口要接收请求,耗时的图片处理想独立运行,可以让工作进程接收队列中的任务。
  • 一台机器上启动多个服务实例处理请求时,可以查看各进程的资源占用和退出情况。
  • 某个插件或计算任务可能崩溃,你希望它与主服务分开运行,并由外部机制检测和重启。

不适合用

  • 只是想把一个函数拆成几步、方便阅读,不必新开进程;直接拆函数更简单。
  • 同一服务里有大量等待网络响应的任务,不必为每个任务开进程;可先考虑异步任务或协程。
  • 想让用户数据在服务重启后还在,单靠增加进程没用;用数据库等持久化存储。

练一练

你的网站要处理用户上传的视频。转码耗时较长,偶尔还会让处理程序退出。你希望网页接口继续响应,并能重新安排失败的任务。哪种设计更合适?

让 AI 帮你做

请检查当前网站的视频转码流程:说明接口服务和转码工作进程如何分工,任务如何传递、记录状态,以及工作进程退出后如何发现并重新安排未完成任务。先给方案和风险,再改代码;不要把任务只存在进程内存中。

接下来学什么