今日内容
一、进程
1.1父进程与子进程
什么是父子进程:当前运行的程序内再运行了另一个程序,那么后面开启的进程称之为当前进程的子进程,当前进程称之为后面开启进程的父进程
from multiprocessing import Process
import os
import time
def task(n):
print("父进程:%s 自己:%s 正在运行" %(os.getppid(),os.getpid()))
time.sleep(3)
print("父进程:%s 自己:%s 正在运行" %(os.getppid(),os.getpid()))
if __name__ == "__main__":
p = Process(target=task,args=(3,))
p.start()
print("主",os.getpid())
1.2僵尸进程
什么是僵尸进程:在每个子进程正常结束后操作系统会回收子进程的重型资源,但会保留一些子进程的信息,比如pid等,这时的子进程称之为僵尸进程
解决僵尸进程方式:首先少量的僵尸进程不会影响程序的运行,只有不断增加而且一直不回收的僵尸进程才会导致程序因为没有pid号而运行不了
解决方式:基于解释器的封装机制,在父进程正常结束运行后会自动检测产生的僵尸进程并清空回收,所以并不需要自己手动清除
1.3孤儿进程
什么是孤儿进程:在子进程还在运行时父进程已经结束了,这时的子进程称之为孤儿进程
孤儿进程释放的两种方式:
1、在父进程正常结束后会等子进程运行结束后释放孤儿进程的资源
2、在杀死父进程时孤儿进程会被pid号为1的init进程接管,init进程会检测孤儿进程的状态,当孤儿进程运行完毕后会进行释放子进程资源
1.4守护进程
守护进程
什么时守护进程:当父进程结束后无论子进程处在什么状态都会跟着一起结束,这时子进程称之为父进程的守护进程
运用场景:用于父进程结束后子进程的存在已经没有了意义,所以会一起结束
代码演示:
from multiprocessing import Process
import time
import random
class Piao(Process): #这时子进程为主进程的守护进程,在主进程结束后子进程内代码不会在运行了
def __init__(self,name):
self.name=name
super().__init__()
def run(self):
print('%s is piaoing' %self.name)
time.sleep(random.randrange(1,3))
print('%s is piao end' %self.name)
p=Piao('egon')
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print('主')
1.5互斥锁
什么是互斥锁:当多个进程共享同一文件时,如果都能同时修改的话会造成数据的混乱,所以这时需要控制修改文件的顺序
在进程需要修改文件时设置一把锁,当哪个进程抢到这把锁时才能进行文件的修改,当进程把这把锁释放掉时后面的进程才能开始抢这把锁,有锁才能对文件进行修改
以抢票举例:
文件db的内容为:{"count":1}
注意一定要用双引号,不然json无法识别
#没有加锁时,只有一张票,每个用户都可以抢票成功
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open('db.txt'))
print(' 33[43m剩余票数%s 33[0m' %dic['count'])
def get():
dic=json.load(open('db.txt'))
time.sleep(0.1) #模拟读数据的网络延迟
if dic['count'] >0:
dic['count']-=1
time.sleep(0.2) #模拟写数据的网络延迟
json.dump(dic,open('db.txt','w'))
print(' 33[43m购票成功 33[0m')
def task(lock):
search()
get()
if __name__ == '__main__':
lock=Lock()
for i in range(5): #模拟并发5个客户端抢票
p=Process(target=task,args=(lock,))
p.start()
#加了锁时,这时所有用户都可以看到票的数量,但是只有抢到了锁的用户才能先抢到票
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open('db.txt'))
print(' 33[43m剩余票数%s 33[0m' %dic['count'])
def get():
dic=json.load(open('db.txt'))
time.sleep(0.1) #模拟读数据的网络延迟
if dic['count'] >0:
dic['count']-=1
time.sleep(0.2) #模拟写数据的网络延迟
json.dump(dic,open('db.txt','w'))
print(' 33[43m购票成功 33[0m')
def task(lock):
search()
lock.acquire()
get()
lock.release()
if __name__ == '__main__':
lock=Lock()
for i in range(5): #模拟并发5个客户端抢票
p=Process(target=task,args=(lock,))
p.start()