进程的特征:
--动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
--并发性:任何进程都可以同其他进程一起并发执行
--独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源的独立单位;
--异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
--结构特征:进程由程序、数据和进程控制块三部分组成。
--多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
进程和程序的区别:
--程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
--而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
--程序可以作为一种软件资料长期存在,而进程是有一定生命期的。
--程序是永久的,进程是暂时的。
注意:同一个程序执行两次,就会在操作系统中出现两个进程,所以我们可以同时运行一个软件,分别做不同的事情也不会混乱。
在python程序中的进程操作:
1 from multiprocessing import Process 2 import os 3 import time 4 5 def func(arg1): 6 print("开启子进程的函数") 7 print("主进程的子进程:",os.getpid()) # 查看当前进程的进程号 8 print("子进程的父进程:", os.getppid()) 9 time.sleep(2) 10 print("%s是个pig"%arg1) 11 12 if __name__ == '__main__': 13 p = Process(target=func,args=("yl",)) 14 #创建一个进程,传入参数的时候必须传元组的形式 15 # p是一个进程对象,还没有启动进程 16 p.start() #开启了一个子进程 17 print('主进程 :',os.getpid()) 18 # 此处的进程号等于func函数中的子进程的父进程的进程号 19 print('主进程的父进程 :',os.getppid()) # 查看当前进程的父进程 20 print("我是主进程") 21 22 # 输出结果: 23 主进程 : 80268 24 主进程的父进程 : 50360 25 我是主进程 26 开启子进程的函数 27 主进程的子进程: 77768 28 子进程的父进程: 80268 29 yl是个pig 30 31 # 开启了子进程的主进程 : 32 # 主进程自己的代码如果长,等待自己的代码执行结束, 33 # 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后 主进程才结束
3.p.join()的用法
1 import time 2 from multiprocessing import Process 3 4 def func(arg1,arg2): 5 print('*'*arg1) 6 time.sleep(2) 7 print('*'*arg2) 8 9 if __name__ == '__main__': 10 p = Process(target=func,args=(10,20)) 11 p.start() 12 print('hahahaha') 13 p.join() # 是感知一个子进程的结束,将异步的程序改为同步 14 # 相当于主进程在此处被阻塞,等待子进程运行结束之后再运行此处后面的代码 15 print('====== : 运行完了') 16 17 # 输出结果: 18 hahahaha 19 ********** 20 ******************** 21 ====== : 运行完了
4.多进程之间的数据隔离问题
1 import os 2 from multiprocessing import Process 3 4 def func(): 5 global n # 声明了一个全局变量 6 n = 0 # 重新定义了一个n 7 print('pid : %s'%os.getpid(),n) 8 9 if __name__ == '__main__': 10 n = 100 11 p = Process(target=func) 12 p.start() 13 p.join() 14 print(os.getpid(),n) 15 #此处的n仍然为,主进程的n,未受到子进程创建的全局变量的影响 16 17 # 执行结果: 18 # pid : 884 0 19 # 11932 100 20 21 #多进程之间的数据是隔离的,互不影响
5.使用面向对象中类的知识来创建进程
1 # 可以传入参数的 2 from multiprocessing import Process 3 4 class MyProcess(Process): #继承Process类 5 def __init__(self,arg1,arg2): 6 super().__init__() # 调用父类的__init__方法(必须写,否则报错) 7 self.arg1 = arg1 8 self.arg2 = arg2 9 10 # 必须有run方法,子进程执行的就是run方法中的代码 11 def run(self): 12 print(self.pid) #打印进程的进程号 13 print(self.name) #打印进程的进程名,等同于os.getpid() 14 print(self.arg1) 15 print(self.arg2) 16 17 if __name__ == '__main__': 18 p1 = MyProcess(1,2) 19 p1.start() 20 p2 = MyProcess(3,4) 21 p2.start() 22 使用面向对象中类的知识来创建进程
6.开启多个子进程
1 from multiprocessing import Process 2 import time 3 import os 4 5 def func(arg1,arg2): 6 print('*'*arg1) 7 time.sleep(2) 8 print('*'*arg2) 9 10 if __name__ == '__main__': 11 p = Process(target=func,args=(5,10)) 12 p.start() 13 p1 = Process(target=func,args=(5,10)) 14 p1.start() 15 p2 = Process(target=func,args=(5,10)) 16 p2.start() 17 p3 = Process(target=func,args=(5,10)) 18 p3.start() 19 20 # 开启了4个子进程,4个子进程同时运行,运行顺序不能确定先后顺序 21 # 22 # if __name__ == '__main__': 23 # for i in range(10): 24 # p = Process(target=func, args=(5*i, 10*i)) 25 # p.start() 26 # # 开启的多个子进程的运行顺序没有先后(但是是按照顺序给操作系统发的指令开启进程) 27 # # p.join() # 多个进程变成同步,执行效率低 28 # 29 # # p.join() 30 # 此处的p相当于p9,总是在i等于9时开的之进程执行完成之后执行 print('执行完了'), 31 # 因为所开的子进程不按顺序执行,所以不能保证 print('执行完了') 最后执行 32 # print('执行完了') 33 34 35 # if __name__ == '__main__': 36 # p_lst = [] 37 # for i in range(10): 38 # p = Process(target=func,args=(5*i,10*i)) 39 # p_lst.append(p) 40 # p.start() 41 # 42 # [p.join() for p in p_lst] 43 # (列表推导式)之前的所有进程必须在这里都执行完才能执行下面的代码 44 # print('执行完了') 45 # 这种方法可以保证 print('执行完了'),是最后执行。
7.守护进程
1 # 子进程 -- > 守护进程 2 # 主进程代码执行结束守护进程立即结束 3 import time 4 from multiprocessing import Process 5 6 def func(): 7 while True: 8 time.sleep(0.2) 9 print('我还活着') 10 11 def func2(): 12 print('in func2 start') 13 time.sleep(3) 14 print('in func2 finished') 15 16 if __name__ == '__main__': 17 p = Process(target=func) 18 p.daemon = True # 设置子进程为守护进程,必须在start前设置 19 p.start() 20 p2 = Process(target=func2) 21 p2.start() 22 p2.terminate() # 结束一个子进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活 23 time.sleep(1)。 24 print(p2.is_alive()) # 检验一个进程是否还活着 25 # time.sleep(1) 26 print(p2.name) 27 # i = 0 28 # while i<5: 29 # print('我是socket server') 30 # time.sleep(1) 31 # i+=1 32 33 # 输出的结果: 34 我还活着 35 我还活着 36 我还活着 37 False 38 Process-2 39 40 # 守护进程会随着主进程的代码执行完毕 而 结束 41 # 在主进程内结束一个子进程 p.terminate() 42 # 结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程 43 # 检验一个进程是否活着的状态 p.is_alive() 44 # p.name p.pid 这个进程的名字和进程号

1 import os 2 import time 3 from multiprocessing import Process 4 5 class Myprocess(Process): 6 def __init__(self,person): 7 super().__init__() 8 self.person = person 9 def run(self): 10 print(os.getpid(),self.name) 11 print('%s正在和女主播聊天' %self.person) 12 13 if __name__ == '__main__': 14 p=Myprocess('哪吒') 15 p.daemon=True 16 #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行 17 p.start() 18 time.sleep(1) # 在sleep时查看进程id对应的进程 19 print('主') 20 21 # 输出的结果: 22 92480 Myprocess-1 23 哪吒正在和女主播聊天 24 主
8.进程锁
import json import time from multiprocessing import Process,Lock # from multiprocessing import Lock def show(i): with open('ticket') as f: dic = json.load(f) print('余票: %s'%dic['ticket']) def buy_ticket(i,lock): lock.acquire() #拿钥匙进门 with open('ticket') as f: dic = json.load(f) time.sleep(0.1) if dic['ticket'] > 0 : dic['ticket'] -= 1 print('