一、单核多任务cpu执行原理:
10年前:单核多任务cpu运行:
整个cpu分割成多个cpu时间片段,每个时间片段执行一个任务,当执行任务1时,任务2和任务3处于等待状态,因为时间片段很短毫秒级别的,所以当把时间拉长为1s时,这些任务都执行了,给人的感官是并行执行的。
二、进程:
1、什么是进程?
打开一个浏览器就是,就是启动了一个浏览器进程;
打开一个记事本,就是启动了一个记事本进程。
进程是执行任务的基本单元,也是操作系统执行任务的基本单元。进程中包含了程序指令和相关资源的集合,
2、查看进程:
在windows下,可以打开任务管理器,在任务标签中就可以看到计算机中正在运行的程序。
3、进程特点:
a、进程之间的资源是不共享的,是隔离的
b、进程是重量级别的,在进程中,需要处理的问题包括进程间通信,临界区管理和进程调度,这些特性使得新生成一个进程的开销比较大
三、线程
什么是线程?
线程是进程中执行任务的基本单元,例如:迅雷下载文件,把文件切成多个部分,再用多线程方式分别进行下载。
线程特点:
a、线程之间可以共享资源,容易进行通信
b、由a得,线程是轻量级别的,生成一个线程开销比较小
c、使用线程会出现死锁和数据混乱的问题
进程和线程示意图:
所以,针对I/O受限的程序,如网络下载类,可以使用多线程来提高程序性能。而对于CPU受限的程序,如科学计算类,使用多线程并不会带来效率的提升。这个时候,建议使用进程或者混合进程和线程的方法来实现。
四、进程的开发之调用系统命令
1、引用模块:subprocess
执行顺序:
父进程中的子进程调用系统命令后再将输出结果传给父进程
stdin:往系统命令传递的参数
stdout:输出的正常结果
stderr:输出的错误结果
2、run()方法:返回的不是我们想要的执行结果或者相关信息,而是一个CompleteProcess类型对象
args:启动进程的参数,通常是个列表或字符串。
subprocess.PIPE:接收子进程的返回信息
returncode:进程结束状态返回码。0表示成功状态。
3、Popen:它的返回值是一个Popen对象,而不是completedProcess 对象。
s.stdin.write():可以输入数据,
s.stdout.read():则能输出数据。
五、进程的开发之创建子进程
1、模块:multiprocessing
2、创建子进程并调用某个函数
p = Process(target=func1, args=(‘进程%d’ % i,)) 创建一个子进程
p.start() 启动子进程
父进程的代码中默认没有任何阻塞,同时父进程必须等待所有子进程结束之后才停止
3、类创建子进程并调用某个函数
p.join():我们一般都会需要父进程等待所有子进程的执行结束,才会执行后面的代码,
p.join(): 等待当前的子进程p结束,
p.join():是一个阻塞函数
为什么要用列表? 10个子进程可以并行执行
六、使用进程的优点:
1、可以使用计算机多核,进行任务的并发执行,提高执行效率,运行不受其他进程影响,创建方便
2、空间独立,数据安全
使用进程缺点:
1、进程的创建和删除消耗的系统资源较多
2、全局变量在多个进程中不能共享
3、在子进程中修改全局变量对父进程中的全局变量没有影响。因为父进程在创建子进程时对全局变量做了一个备份,父进程中的全局变量与子进程的全局变量完全是不同的两个变量。全局变量在多个进程中不能共享。
执行结果:
主进程里定义的变量g,子进程run,run1里可以访问变量g,但是不可以修改,原理是创建子进程是会将主进程的资源copy一份给子进程,子进程可以访问主进程的资源,但是没有修改的权限。