守护进程
1 p=Process(target=task,) 2 p.daemon = True #必须在p.start()前设置 3 p.start() 4 time.sleep(1) 5 # p.join() 6 print('主')
守护进程是守护主进程,主进程死掉了,守护进程也就结束了。
1:守护进程到底什么时候死?:2做完
2:主进程到底什么时候算执行完毕:主进程运行完毕最后一行代码
3:主进程什么时候应该死掉:等到所有的非守护的子进程都死掉,主才死
4:主进程执行完毕了,是否意味着主进程会立马死掉? 否
守护进程内不能再开子进程 会造成僵尸进程
锁 (互斥锁)
from multiprocessing import Process,Lock lock=Lock lock.acquire() lock.release()
使用的时候需要将锁传给子进程。(不传的话就是生成了很多个锁)
支持上下文管理协议
1 with lock:
2 search()
3 get()
解决方法,递归锁,在Python中为了支持在同一线程中多次请求同一资源,python提供了可重入锁RLock。
这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:
mutexA=mutexB=threading.RLock() #一个线程拿到锁,counter加1,该线程内又碰到加锁的情况,p
则counter继续加1,这期间所有其他线程都只能等待,等待该线程释放所有锁,即counter递减到0为止
Manger().Lock 有个问题对于子进程而言 进程内的数据是不共享的,所以我们如果想在开启多进程的时候修改一个公共数据 ,只能使用 文件的方式,无法使用Lock 。这个时候我们就需要共享一块内存了
Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。