Python的学习之旅———锁,递归锁 守护进程 manger().Lock

守护进程

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,该线程内又碰到加锁的情况,
则counter继续加1,这期间所有其他线程都只能等待,等待该线程释放所有锁,即counter递减到0为止
p

Manger().Lock  有个问题对于子进程而言 进程内的数据是不共享的,所以我们如果想在开启多进程的时候修改一个公共数据 ,只能使用 文件的方式,无法使用Lock 。这个时候我们就需要共享一块内存了

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

原文地址:https://www.cnblogs.com/surehunter/p/7890400.html