1.进程
什么是进程:
一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统
2.多进程
多个正在运行的程序
在python中实现多线程的方法
from multiprocessing import Process import os import time # 当出现一些耗时时间比较长的操作时,会导致程序进入阻塞状态,无法执行其他代码 # 这个时候就可以开启子进程把任务交给他 def task(name): print('name%s子进程开始!'% name) print('name%s子进程结束!'% name) if __name__ == '__main__': p = Process(target=task,args=('大哥',)) # 开启子进程,本质是向操作系统发送请求,让它启动进程,通常不可能立即开启 p.start() p.join() print('父进程结束') ''' PS:windows 和 linux 开启进程的方式不同 相同之处:都是需要将数据copy一份给子进程,这样 子进程才知道要干什么 linux 会将父进程的所有数据 完全copy,然后拿到父进程,知道代码的位置,继续执行 windows 会copy 一部分数据 同时会导入py文件来执行,这样一来就会递归开启进程 所以windows中开启子进程都需要开启判断 不过都建议加上判断,可以保证两个平台都可以使用 记住: 开启进程的代码,都把它放到 if __name__ == '__main__': 中即可 '''
自定义开启子进程:
3.进程与程序的区别
程序就是一堆计算机可以识别文件,程序在没有被运行就是躺在硬盘上的一堆二进制
运行程序时,要从硬盘读取数据到内存中,CPU从内存读取指令并执行 ,
一旦运行就产生了进程
一个程序可以多次执行 产生多个进程,但是进程之间相互独立
当我们右键运行了一个py文件时 ,其实启动的是python解释器,你的py文件其实是当作参数传给了解释器
4.程序运行的三种状态
1. 阻塞与非阻塞
阻塞:当程序遇到IO操作(输入输出)时,就进入了阻塞状态
非阻塞:程序正常运行种,没有遇到任何IO操作,就处于非阻塞状态
阻塞与非阻塞说的是程序运行状态
2.并发
同一时间段,有多个程序都处于运行状态,但一个时间点只有一个程序被CUP处理,本质上切换执行,切换的同时,保存上一个任务的操作
3.并行
同一时间段,多个任务同时被CUP处理
并发与并行说的是任务的处理方式
PS:关于程序员永恒的话题
提高效率
根本方法就是让程序尽可能处于运行状态
减少IO 尽可能多占用CPU时间
5.multiprocessing模块的使用(Process常用方法,join函数,)
# Process其他使用方法
from multiprocessing import Process def task(): print('121212') exit(100) # 退出码 if __name__ == '__main__': p = Process(target=task,name='李果') p.start() # 此处名为懒加载优化机制,如果没有调用start ,那么该对象将不会被创建 p.join() # 等待子进程结束 p.terminate() # 终止进程 print(p.is_alive()) # 判断进程是否存活 print(p.pid) # 查看PID print(p.exitcode) # 获取退出码
import time from multiprocessing import Process def stak(i): print('买烟去了') time.sleep(i) print('%s 买完了!'% i) if __name__ == '__main__': strat_time = time.time() p1 = Process(target=stak,args=(1,)) p2 = Process(target=stak,args=(2,)) p3 = Process(target=stak,args=(3,)) # strat() 是同时进行的 p1.start() p2.start() p3.start() # join等待的顺序是根据子进程工作结束的顺序来定的 p1.join() p2.join() p3.join() end_time = time.time() print(end_time - strat_time) print('over')
6.僵尸与孤儿进程
孤儿进程:
指的是,父进程先结束 ,而子进程还在运行着,
孤儿进程无害,有 其存在的必要性
例如:qq开启了浏览器,qq先退出了 浏览器应该继续运行
孤儿进程会被操作系统接管
僵尸进程:
值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程
僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程
linux 中有一个wai/waitpid 用于父进程回收子进程资源