守护进程:
主进程创建守护进程
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children
注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止
1 def foo(n): 2 print('foo') 3 time.sleep(2) 4 print('foo .. end') 5 6 def bar(m): 7 print('bar') 8 time.sleep(5) 9 print('bar .. end') 10 11 if __name__ == '__main__': 12 p=Process(target=foo,args=(2,)) 13 p1=Process(target=bar,args=(3,)) 14 p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行 15 p.start() 16 p1.start() 17 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 2 import os,time,random 3 4 def task(): 5 print('%s is running' %os.getpid()) 6 time.sleep(random.randint(1,3)) 7 print('%s is end' %os.getpid()) 8 9 if __name__ == '__main__': 10 p1=Process(target=task) 11 p2=Process(target=task) 12 p3=Process(target=task) 13 p1.start() 14 p1.join() 15 p2.start() 16 p2.join() 17 p3.start() 18 p3.join() 19 print('主')
进程同步锁/互斥锁
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,
竞争带来的结果就是错乱,如何控制,就是加锁处理
示列一:多个进程共享同一个打印终端
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()
示例二:多个进程共享一个文件,文件好比数据库,模拟抢票
#文件db的内容为:{"count":1}
#注意一定要用双引号,不然json无法识别
Lock:锁
acquire:加锁
release:解锁
with:自动加上锁,待代码执行完后自动解开锁
from multiprocessing import Process,Lock import time,json,random def search(): dic=json.load(open('db.txt')) print('