1. 多进程与多线程编程
(1)背景:为什么须要多进程或者多线程:
在同一时间里,同一个计算机系统中若是容许两个或者两个以上的进程处于运行状态,这即是多任务。多任务会带来的好处例如用户边听歌、边上网、边打印,而这些任务之间丝绝不会互相干扰。使用多进程技术,可大大提升计算机的运算速率。多线程
(2)多进程与多线程的区别:并发
进程:程序在计算机上的一次执行活动。进程分为:系统进程和用户进程。异步
当运行一个程序时,实际就是启动了一个进程。程序是死的(静态的),进程是活的(动态的)。函数
线程:是程序中的一个单一的顺序控制流程。spa
进程是一个相互独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元(指运行中程序的调度单位)。操作系统
区别:进程是资源分配的最小单位,线程是CPU调度的最小单位。线程
线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器、栈指针)以及堆栈组成,它是比进程更小的单位。 设计
线程是程序中的一个执行流。一个执行流是由CPU运行程序代码并操做程序的数据所造成的。所以,线程被认为是以CPU为主体的行为。 指针
线程不包含进程地址空间中的代码和数据,线程是计算过程在某一时刻的状态。因此,系统在产生一个线程或各个线程之间切换时,负担要比进程小得多。
线程是一个用户级的实体,线程结构驻留在用户空间中,可以被普通的用户级函数直接访问。
一个线程自己不是程序,它必须运行于一个程序(进程)之中。所以,线程能够定义为一个程序中的单个执行流。
多线程是指一个程序中包含多个执行流,多线程是实现并发的一种有效手段。一个进程在其执行过程当中,能够产生多个线程,造成多个执行流。每一个执行流即每一个线程也有它自身的产生、存在和消亡的过程。
多线程程序设计的含义就是能够将程序任务分红几个并行的子任务。
在Windows系统中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这种状况更加复杂,有以下关系:
总线程数<=CPU数量,并行运行
总线程数>CPU数量,并发运行。 并行运行的效率明显高于并发运行。
2. 多进程编程
第一,进程是一个实体,每个进程都有它本身的地址空间,通常状况下,包括文本区域、数据区域和堆栈区域。
文本区域:存储处理器执行的代码;
数据区域:存储变量和进程执行期间使用的动态分配的内存.
堆栈区域:存储着活动过程当中调用的指令和本地变量。
第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操做系统执行之),它才能成为一个活动的实体,称其为进程。
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生、动态消亡的;
并发性:任何进程均可以同其余进程一块儿并发执行。
独立性:进程是一个可以独立运行的基本单元,同时也是系统分配资源和调度的独立单元;
异步性:进程间的相互制约,使得进程具备执行的间断性。
结构特征:进程由程序、数据、进程控制块三部分组成。
多个不一样进程能够包含相同的程序:一个程序在不一样数据集里就构成不一样的进程,能获得不一样的结果,可是在执行过程当中,程序不能发生变化。
就绪状态:进程已经得到除处理器外所需资源,等待分配处理器资源,只要分配了处理器进程就可执行;
运行状态:进程占用处理器资源、处于此状态的进程数目小于或者等于处理器的数目;阻塞状态:因为进程等待某种条件,在条件知足以前没法继续执行。
Multiprocessing是Python提供的很是好用的多进程包,用户只须要简单的定义一个函数,
Python就会自动地完成其余的全部事情。它支持子进程、进程间通讯、数据共享、不一样形式的同步,提供了包括Process、Queue、Pipe、Lock在内的各类组件。合理运用这些组件,能够轻松地完成单进程到并发执行的转换。
建立进程Process模块:
class multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={})
其中,group为None,它的存在是为了兼容threading.Thread,target表示调用对象,name为别名,args表示调用对象的位置参数元组,kwargs表示调用对象的字典。
例如:建立函数并将其做为多个进程
import multiprocessing
import time
def worker_1(interval):
print("worker_1")
time.sleep(interval)
print("end worker_1")
def worker_2(interval):
print("worker_2")
time.sleep(interval)
print("end worker_2")
def worker_3(interval):
print("worker_3")
time.sleep(interval)
print("end worker_3")
if __name__=='__main__':
p1=multiprocessing.Process(target=worker_1,args=(2,))
p2=multiprocessing.Process(target=worker_2,args=(3,))
p3=multiprocessing.Process(target=worker_3,args=(4,))
p1.start()
p2.start()
p3.start()
print("The number of CPU is:"+str(multiprocessing.cpu_count()))
for p in multiprocessing.active_children():
print("child p.name:"+p.name+"\tp.id"+str(p.pid))
#运行结果:
The number of CPU is:4
child p.name:Process-2 p.id9804
child p.name:Process-1 p.id9172
child p.name:Process-3 p.id6608
注释#:上述代码中使用multiprocessing.cpu_count()函数查看当前计算机的CPU数量,并经过语句multiprocessing.active_children()和for()循环的结合使用,可以清楚地查看当前活动的进程数。运行结果以worker_一、二、3的顺序输出,说明这三个进程间是并发执行的,因此每次开始时的输出顺序可能有所不一样。