文章目录
进程的概念
当我们双击的时候,操作系统将程序装载到内存中,操作系统为它分配资源,然后才能运 行。运行起来的应用程序就称之为进程。也就是说当程序不运行的时候我们称之为程序,当 程序运行起来他就是一个进程。通俗的理解就是不运行的时候是程序,运行起来就是进程。 程序和进程的对应关系是:程序只有一个,但是进程可以有多个。
进程的特征
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
- 结构特征:进程由程序、数据和进程控制块三部分组成。
- 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
程序与进程的区别
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程是程序正在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定的生命期的。
程序是永久的,进程是暂时的。
进程的状态
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行 和 阻塞。
- 就绪(Ready)状态
当进程已分配到除CPU以为的所有必要的资源,只要获得处理机便可立即执行,这时进程状态称为就绪状态。 - 执行/运行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。 - 阻塞(Blocked)状态
正在执行的进程,由于等待某个时间发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的时间有多种,例如:等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
multiprocess模块
Python中提供了multiprocess。仔细来说multiprocess不是一个模块而是python中一个操作、管理进程的包。之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。大致分为四个部分:创建进程部分、进程同步部分、进程池部分、进程之间数据共享。
Process模块介绍
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
强调:
- 需要使用关键字的方式来指定参数
- args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
- group参数未使用,值始终为None
- target表示调用对象,即子进程要执行的任务
- args表示调用对象的位置参数元组,args=(1,2,‘egon’,)
- kwargs表示调用对象的字典,kwargs={‘name’:‘egon’,‘age’:18}
- name为子进程的名称
在Windows中使用Process模块的注意事项
在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程的部分使用if name ==‘main’ 判断保护起来,import 的时候 ,就不会递归运行了。
使用Process模块创建进程
创建并开启子进程的两种方式
(方法一):
import os
from multiprocessing import Process
def func(name):
print("hello",name)
print("我是子进程:%d 我的父进程id是:%d" %(os.getpid(),os.getppid()))
if __name__ == '__main__':
p=Process(target=func,args=('xiaobai',))
p.start()
print("我是父进程:%d" % os.getpid())
运行截图:
(方法二):
# 通过继承Process类的形式开启进程的方式
import os
from multiprocessing import Process
class info(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print(os.getpid())
print(" %s 正在和父母打电话" % self.name)
if __name__ == '__main__':
p1=info('cc')
p2=info('kk')
p1.start()# start会自动调用run方法
p2.start()
# 说明:如果需要传参,必须写入到__init__方法里面,且必须加上super().__init__();因为父类Process里面也有__init__方法。
运行截图:
Process对象的join方法
import time
from multiprocessing import Process
def fun(name):
print('hello',name)
time.sleep(1)
print('我是子进程')
if __name__ == '__main__':
p=Process(target=fun,args=('cc',))
p.start()
p.join() # 加上join方法后,父进程就会阻塞等待子进程结束而结束。
print("我是父进程")
运行截图:
Process开启多进程
多个进程同时运行(注意:子进程的执行顺序不是根据自动顺序决定的)
import time
from multiprocessing import Process
def func(name):
print("hello 进程 %d" % name)
time.sleep(1)
if __name__ == '__main__':
for i in range(1,10):
p=Process(target=func,args=(i,))
p.start()
运行截图:
多个进程同时运行,用join方法①
import time
from multiprocessing import Process
def func(name):
print("hello 进程 %d" % name )
time.sleep(0.1)
if __name__ == '__main__':
p_lst = []
for i in range(10):
p = Process(target=func, args=(i,))
p.start()
p_lst.append(p)
print("父进程执行中")
运行截图:
多个进程同时运行,用join方法②
import time
from multiprocessing import Process
def func(name):
print("hello 进程 %d" % name )
time.sleep(0.1)
if __name__ == '__main__':
p_lst = []
for i in range(10):
p = Process(target=func, args=(i,))
p.start()
p_lst.append(p)
p.join()
print("父进程执行中")
运行截图: