守护进程
主进程创建守护进程
1)守护进程会在主进程代码执行结束后就终止
2)守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children
注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
复制代码
from multiprocessing import Process
import time
import random
class Run(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=Run(‘anne’)
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
print(‘主’)
复制代码
复制代码
#主进程代码运行完毕,守护进程就会结束
from multiprocessing import Process
from threading import Thread
import time
def foo():
print(123)
time.sleep(1)
print(“end123”)
def bar():
print(456)
time.sleep(3)
print(“end456”)
p1=Process(target=foo)
p2=Process(target=bar)
p1.daemon=True
p1.start()
p2.start()
print(“main-------”) #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止
复制代码
只是守护进程结束,非守护进程不受影响
四 进程同步(锁)
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,
而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。
例1:多个进程共享同一打印终端
复制代码
#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
from multiprocessing import Process
import os,time
def work():
print(’%s is running’ %os.getpid())
time.sleep(2)
print(’%s is done’ %os.getpid())
if name == ‘main’:
for i in range(3):
p=Process(target=work)
p.start()
复制代码
复制代码
#由并发变成了串行,牺牲了运行效率,但避免了竞争
from multiprocessing import Process,Lock
import os,time
def work(lock):
lock.acquire()
print(’%s is running’ %os.getpid())
time.sleep(2)
print(’%s is done’ %os.getpid())
lock.release()
if name == ‘main’:
lock=Lock()
for i in range(3):
p=Process(target=work,args=(lock,))
p.start()
复制代码
例2:多个进程共享同一文件
文件当数据库,模拟抢票
复制代码
#文件db的内容为:{“count”:1}
#注意一定要用双引号,不然json无法识别
#并发运行,效率高,但竞争写同一文件,数据写入错乱
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open(‘db.txt’))
print(’\033[43m剩余票数%s\033[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(’\033[43m购票成功\033[0m’)
def task(lock):
search()
get()
if name == ‘main’:
lock=Lock()
for i in range(100): #模拟并发100个客户端抢票
p=Process(target=task,args=(lock,))
p.start()
复制代码
复制代码
#文件db的内容为:{“count”:1}
#注意一定要用双引号,不然json无法识别
#购票行为由并发变成了串行,牺牲了运行效率,但保证了数据安全
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open(‘db.txt’))
print(’\033[43m剩余票数%s\033[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(’\033[43m购票成功\033[0m’)
def task(lock):
search()
lock.acquire() #获取锁
get()
lock.release() #释放锁
if name == ‘main’:
lock=Lock()
for i in range(100): #模拟并发100个客户端抢票
p=Process(target=task,args=(lock,))
p.start()
复制代码
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。