多道技术
1.空间上的复用: 多个程序共用一套计算机硬件
2.时间上的复用: 切换+保存状态
1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)
2.当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)
并发:看起来像同时运行的就可以
并行:真正意义上的同时执行
单核的计算机能不能实现并行,但是可以实现并发
同步异步:表示的是任务的提交方式
同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事(程序层面的 表现就是卡住了)
异步:任务提交之后 不再原地等待 而是继续执行下一行代码(结果是要的 但是是用过其他方式 获取)
阻塞非阻塞:表示的程序的运行状态
阻塞:阻塞态
非阻塞:就绪态 运行态
创建进程的两种方式
# 创建进程会将代码以模块的方式从上往下执行一遍 方式一 from multiprocessing import Process import time def test(name): print(‘%s‘%name) time.sleep(1) print(‘hi‘) if __name__ == ‘__main__‘: #在创建进程时,在if __name__ == ‘__main__‘:内创建 p = Process(target=test,args=(‘egon‘,)) #创建一个进程对象 p.start() #告诉操作系统,要创建一个进程 time.sleep(1) print(‘hello‘) 方式二 from multiprocessing import Process import time class MyClass(Process): def __init__(self,name): super().__init__() self.name = name def test(self): print(‘%s‘%self.name) time.sleep(1) print(‘hi‘) if __name__ == ‘__main__‘: p = MyClass(‘egon‘) p.start() p.test() print(‘gun‘)
join方法是先执行完子程序之后. 在执行主程序
from multiprocessing import Process import time def test(name,i): time.sleep(i) print(‘hello‘) if __name__ == ‘__main__‘: # p_list = [] # for i in range(3): # p = Process(target=test,args=(‘进程‘,i)) # p.start() # p_list.append(p) # for p in p_list: # p.join() # print(‘gun‘) p = Process(target=test,args=(‘egon‘,1)) p1 = Process(target=test,args=(‘jason‘,2)) start_time = time.time() p.start() p1.start() p.join() p1.join() print(‘hi‘) print(time.time()-start_time)
进程对象的其他方法
from multiprocessing import Process,current_process import os import time def test(name): print(‘%s‘%name,current_process().pid,‘子进程%s‘%os.getpid(),‘父进程%s‘%os.getppid()) time.sleep(2) print(‘hello‘) if __name__ == ‘__main__‘: p = Process(target=test,args=(‘egon‘,)) p.start() time.sleep(1) p.terminate() # 杀死当前进程,本质是让操作系统帮你去杀死一个进程 time.sleep(1) print(p.is_alive()) # 判断进程是否存活 print(‘gun‘)
僵尸进程与孤儿进程
父进程回收子进程资源的两种方式
1.join方法
2.父进程正常死亡
所有的进程都会步入僵尸进程
孤儿进程
子进程没死 父进程意外死亡
针对linux会有儿童福利院(init) 如果父进程意外死亡他所创建的子进程都会被福利院收养
守护进程
from multiprocessing import Process import time def test(name): print(‘%s‘%name) time.sleep(1) print(‘%s‘%name) if __name__ == ‘__main__‘: p = Process(target=test,args=(‘egon‘,)) p.daemon = True # 将该进程设置为守护进程 p.start() time.sleep(1) print(‘bye‘)
互斥锁
当多个进程操作同一份数据的时候 会造成数据的错乱
这个时候必须加锁处理
将并发变成串行
虽然降低了效率但是提高了数据的安全
注意:
1.锁不要轻易使用 容易造成死锁现象
2.只在处理数据的部分加锁 不要在全局加锁
锁必须在主进程中产生 交给子进程去使用
from multiprocessing import Process,Lock import time import json def search(i): with open(‘data‘,‘r‘,encoding=‘utf-8‘)as f: data = f.read() t_d = json.loads(data) print(‘用户%s查询余票%s‘%(i,t_d.get(‘ticket‘))) def buy(i): with open(‘data‘,‘r‘,encoding=‘utf-8‘)as f: data = f.read() t_d = json.loads(data) time.sleep(1) if t_d.get(‘ticket‘) > 0: t_d[‘ticket‘] -= 1 with open(‘data‘,‘w‘,encoding=‘utf-8‘)as f: json.dump(t_d,f) print(‘抢票成功‘) else: print(‘没票了‘) def run(i,mutex): search(i) mutex.acquire() # 抢锁 buy(i) mutex.release() #释放锁 if __name__ == ‘__main__‘: mutex = Lock() #生成一把锁 for i in range(10): p = Process(target=run,args=(i,mutex)) p.start() data文本文档 {"ticket": 0}
原文地址:https://www.cnblogs.com/zrh-960906/p/11329407.html