今天学习了多进程中的守护进程、互斥锁、队列。
一、守护进程
主进程创建守护进程
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError:daemonic proesses are not allowed to have children
注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
举例:
#主进程代码运行完毕,守护进程就会结束 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') if __name__ == '__main__': p1 = Process(target = foo) p2 = Process(target = bar) p1.daemon = True#一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p随即终止运行 p1.start() p2.start() print('main---------')#打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main---------时,p1也执行了,但是随即被终止
二、进程同步(互斥锁)
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理。
part1:多个进程共享同一打印终端
#并发运行,效率高,但竞争同一打印终端,带来了打印错乱 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()
part2:多个进程共享同一个文件
文件当数据库,模拟抢票
#并发运行,效率高,但竞争写同一文件,数据写入错乱 #文件db的内容为:{"count":1} #注意一定要用双引号,不然json无法识别 from multiprocessing import Process,Lock import time,json,random def search(): dic = json.load(open('db.txt')) print('