python网络进程

多任务编程意义:充分利用计算机的资源提高程序的运行效率定义:通过应用程序利用计算机多个核心,达到同时执行多个任务的目的实施方案:多进程、多线程并行:多个计算机核心并行的同时处理多个任务并发:内核在多个任务间不断切换,达到好像内核在同时处理多个任务的运行效果进程:程序在计算机中运行一次的过程程序:是一个可执行文件,是静态的,占有磁盘,不占有计算机运行资源进程:进程是一个动态的过程描述,占有CPU内存...

python网络进程

多任务编程

意义:充分利用计算机的资源提高程序的运行效率

定义:通过应用程序利用计算机多个核心,达到同时执行多个任务的目的

实施方案多进程多线程

并行:多个计算机核心并行的同时处理多个任务

并发:内核在多个任务间不断切换,达到好像内核在同时处理多个任务的运行效果

进程:程序在计算机中运行一次的过程

程序:是一个可执行文件,是静态的,占有磁盘,不占有计算机运行资源

进程:进程是一个动态的过程描述,占有CPU内存等计算机资源的,有一定的生命周期

* 同一个程序的不同执行过程是不同的进程,因为分配的计算机资源等均不同

父子进程 : 系统中每一个进程(除了系统初始化进程)都有唯一的父进程,可以有0个或多个子进
程。父子进程关系便于进程管理。

进程

CPU时间片:如果一个进程在某个时间点被计算机分配了内核,我们称为该进程在CPU时间片上。

PCB(进程控制块):存放进程消息的空间

进程ID(PID):进程在操作系统中的唯一编号,由系统自动分配

进程信息包括:进程PID,进程占有的内存位置,创建时间,创建用户. . . . . . . .

进程特征:

  1. 进程是操作系统分配计算机资源的最小单位
  2. 每一个进程都有自己单独的虚拟内存空间
  3. 进程间的执行相互独立,互不影响

进程的状态

1、三态

  • 就绪态:进程具备执行条件,等待系统分配CPU
  • 运行态:进程占有CPU处理器,处于运行状态
  • 等待态:进程暂时不具备运行条件,需要阻塞等待,让出CPU

2、五态(增加新建态和终止态)

  • 新建态:创建一个新的进程,获取资源的过程
  • 终止态:进程结束释放资源的过程

查看进程树:   pstree

查看父进程PID: ps -ajx

linux查看进程命令:  ps -aux

有一列为STAT为进程的状态

  D 等待态 (不可中断等待)(阻塞
  S 等待态(可中断等待)(睡眠
  T 等待态(暂停状态)
  R 运行态(就绪态运行态)
  Z 僵尸态

  前台进程(能在终端显示出现象的)
  < 高优先级
  N 低优先级
  l 有多线程的
  s 会话组组长

os.fork创建进程

pid = os.fork() 

功能:创建一个子进程

返回值:创建成功在原有的进程中返回子进程的PID,在子进程中返回0;创建失败返回一个负数

父子进程通常会根据fork返回值的差异选择执行不同的代码(使用if结构)

import  os from time import sleeppid = os.fork()if pid < 0: print("创建进程失败")#子进程执行部分elif pid == 0: print("新进程创建成功")#父进程执行部分else: sleep(1) print("原来的进程")print("程序执行完毕")# 新进程创建成功# 原来的进程# 程序执行完毕
  • 子进程会复制父进程全部代码段(包括fork前的代码)但是子进程仅从fork的下一句开始执行
  • 父进程不一定先执行(进程之间相互独立,互不影响)
  • 父子进程各有自己的属性特征,比如:PID号PCB内存空间
  • 父进程fork之前开辟的空间子进程同样拥有,但是进程之间相互独立,互不影响.

父子进程的变量域

import os from time import sleep a = 1pid = os.fork()if pid < 0: print("创建进程失败")elif pid == 0: print("子进程") print("a = ",a) a = 10000 print("a = ",a)else: sleep(1) print("父进程") print("parent a :",a) # a = 1# 子进程# a =  1# a =  10000# 父进程# parent a : 1

进程ID和退出函数

os.getpid()获取当前进程的PID号

  返回值:返回PID号

os.getppid()获取父类进程的进程号

  返回值:返回PID号

import ospid = os.fork()if pid < 0:  print("Error")elif pid == 0:  print("Child PID:", os.getpid()) # 26537  print("Get parent PID:", os.getppid()) # 26536else:  print("Get child PID:", pid)  # 26537  print("Parent PID:", os.getpid())# 26536

os._exit(status)退出进程

  参数:进程的退出状态  整数

sys.exit([status])退出进程

  参数:默认为0  整数则表示退出状态;符串则表示退出时打印内容

  sys.exit([status])可以通过捕获SystemExit异常阻止退出

import os,sys# os._exit(0)  # 退出进程try: sys.exit("退出")except SystemExit as e: print("退出原因:",e) # 退出原因: 退出

孤儿和僵尸

孤儿进程

父进程先于子进程退出,此时子进程就会变成孤儿进程

  孤儿进程会被系统指定的进程收养,即系统进程会成为该孤儿进程新的父进程。孤儿进程退出时该父进程会处理退出状态

僵尸进程

子进程先与父进程退出,父进程没有处理子进程退出状态,此时子进程成为僵尸进程

  僵尸进程已经结束,但是会滞留部分PCB信息在内存,大量的僵尸会消耗系统资源,应该尽量避免

如何避免僵尸进程的产生

父进程处理子进程退出状态

pid, status = os.wait()

功能:在父进程中阻塞等待处理子进程的退出

返回值: pid 退出的子进程的PID号

     status   子进程的退出状态

import os, syspid = os.fork()if pid < 0:  print("Error")elif pid ==
源文地址:https://www.guoxiongfei.cn/cntech/27160.html
0