如何让程序的执行效率高:减少网络IO与硬盘IO,能从本地取数据就不要从网络上拿,能从内存拿就不要去硬盘拿
如何抗住高并发:将一部分固定不变的数据让用户缓存到本地,使用时再让操作系统问本地拿,
父进程与子进程:
由谁开启,开启者就是被开启者的父进程,被开启者叫子进程
我们运行的python程序其实就是调了Python解释器这个程序将我们写的代码文件传进去
例:
from multiprocessing import Process
import os
def task():
print('父进程pid:%s,自己的pid:%s'%(os.getppid(),os.getpid()))
if __name__=='__main__':
#创建子进程
p=Process(target = task)
p.start() #通知操作系统开子进程
print('主进程pid:%s,主进程的父进程pid:%s'%(os.getpid(),os.getppid()))
僵尸进程与孤儿进程
其实僵尸进程与孤儿进程都是Linux系统中的概念,僵尸进程是Linux系统中特殊的数据结构,在Linux系统中所有的子进程在死后都会进入僵尸进程状态(进程占用的内存资源,CPU资源释放掉,保留了进程的状态信息保留下来如(pid)),这是一种正常的系统机制,保留它的状态信息是为了让父进程在任意时间点都可以知道自己开过哪些进程,查看子进程的状态信息,如果父进程用不到子进程的状态信息,父进程应该定期回收僵尸进程,否则若父进程不停地开进程,同时还不考虑回收子进程,此时会过多的消耗pid,若pid耗尽,会导致无法在开启子进程
在Linux系统中:释放僵尸进程两种方式:
(1)kill—CHLD父进程的pid,
(2)kill-9父进程的pid
top 实时刷新计算机的状态,
zombie表示僵尸进程的数量 Z表示进程的状态
孤儿进程:若一个进程的父进程死了,那么这个进程就是孤儿进程,此时他的父进程是pid为1的进程,pid为1的进程是操作系统,如果此时孤儿进程
结束了那么孤儿进程会被立刻会收掉
上图为手动开启两个僵尸进程
守护进程:
守护进程守护的是主进程的代码,也就是主进程的代码运行完了,就结束了,并不是等到主进程结束,才结束当主进程运行完了以后,另一个进程就没有存在的必要了,此时设成守护进程即可
from multiprocessing import Process
import os,time
def task():
print('进程%s开启'%os.getppid())
time.sleep(10)
print("进程%s结束"%os.getpid())
if __name__=='__main__':
#创建子进程
p=Process(target = task)
p.daemon = True #子进程守护父进程
p.start() #通知操作系统开子进程
print("主:%s"%os.getpid())
time.sleep(3)
关于进程间的通信:
当两个独立的进程,想使用一个共享空间时,可以通过管道、队列和文件来通信
队列就是一个加锁的管道,
互斥锁:应用场景:买票功能,大家可以同时获取到票务信息,但如果只有一张票的话不能同时都买成功,
此时又不能让买票这个操作变成串行,必须一个人买到了以后,别的用户就买不成功了,那么此时就用到了
互斥锁,就类似于大部分用户抢这个互斥锁,谁抢到了,别人就不能买票了,查票仍然可查
from multiprocessing import Process,Lock
import json
import os
import time
def check():
with open('db.json',mode='rt',encoding='utf-8') as f:
time.sleep(1)
dic = json.load(f)
print("%s查看到剩余票数为:%s" %(os.getpid(),dic['count']))
def get():
with open('db.json',mode='rt',encoding='utf-8') as f:
time.sleep(1)
dic = json.load(f)
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(3)
with open('db.json',mode='wt',encoding='utf-8') as f:
json.dump(dic,f)
print('%s购票成功' %os.getpid())
else:
print("购票失败")
def func(mutex):
check()
mutex.acquire()
get()
mutex.release()
# with mutex:
# get()
if __name__ == '__main__':
mutex = Lock()
for i in range(10):
p = Process(target=func,args=(mutex,))
p.start()
# p.join()
print("主")