并发编程(2)
守护进程 daemon方法
Process类中的daemon方法,它的作用是使一个进程守护另一个进程执行,这里的守护的意思是指:如果对方进程先于自己结束,自己无论是否完成都会随之一起结束,而如果是自己进程先结束,对对方无影响
使用方法:在实例化子进程与子进程开始之间加入一句(假设p为子进程):
p = Process()
p.daemon = True
p.start()
daemon作为一个属性在Process类中有定义过,不过默认值是False,所以我们想使用守护程序的这个功能的话要如上修改Process类中daemon属性的值
互斥锁 Lock方法
由于多道技术的时间复用特性(保存+切换),操作系统会在多个进程之间切换执行,这就使我们如果希望某一段进程在执行过程中不被打断,直到执行完再进行切换这样的一个需求很难实现,于是就有了一个lock方法,也就是互斥锁,可以帮助我们实现这种需求
使用方法:Lock也是multiprocessing模块中的一个类,需要导入使用
mutex = Lock() #实例化出一把锁
mutex.acquire() #给以下至release()间的内容加锁,保证此间内容不被切换执行
'''需要加锁的程序'''
mutex.release() #解锁
Lock互斥锁在使用的时候需要注意,锁在只有一把的情况下才能保证互斥,所以创建锁一般放在主程序__main__中创建
优点:保证了某些进程在执行的时候不会出现因为进程切换而导致混乱的情况,比如打印文件
缺点:降低了效率,由原本可以实现的并发效果改成了部分串行
描述程序内互斥锁多少及大小的概念叫做粒度,锁越多及锁住的内容越多粒度就越大,效率就越低;锁越少,锁住的内容越少,效率就越高.所以我们为了提高效率应该尽可能地减少锁的数量及锁住内容的大小
进程间的通信
由于多道技术的空间复用特性,也为了保证程序的安全运行,每个进程所使用的内存空间是必须要相互隔离的,进程与进程之间不进行对话,那么如果几个进程之需要交互该怎么做呢
共享文件 Manager方法
进程与进程之间在内存空间里不能进行通讯,但是可以使用同一个文件或者终端,所以想实现进程之间的交互可以把交互场所放在文件里,Manager方法可以创建共享的列表,字典,数组,队列等等
使用方法:Manager和Process,Lock一样,都是multiprocessing模块中的一个类,需要导入使用
d = [100]
e = {'name':'myz'}
m = Manager() # 创建一个管理器
syncdict = m.list(d) # 让管理器创建一个进程同步的列表
synclist = m.dict(e) # 让管理器创建一个进程同步的字典
进程队列 Queue方法
队列的特点是先进入队列的数据先被提取出来
q = Queue(2) # 创建队列 并且同时只能存储2个元素
q.put(1) # 向队列中加入1这个数据
q.put(2) # 向队列中加入2这个数据
q.get() # 取出第一个加入队列的数据 1
q.get() # 取出第二个加入队列的数据 2
如果队列中没有空余的位置担仍执行put或get的话就会报错