「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。
在之前的 threading 多线程系列文章中(【Python】线程间同步的实现与代码、【Python】多线程之可重入锁、【Python】多线程之信号量与有界信号量),介绍了在 Python 中,多线程之间采用互斥锁和信号量的方式进行同步。在 multiprocessing 多进程中,同样提供了基于互斥锁和信号量的同步机制。
multiprocessing 中的锁
threading 多线程提供了互斥锁 threading.Lock(),对应的 multiprocessing 多进程中,也提供了锁 multiprocessing.Lock()。多进程和多线程中对锁的操作相似:
- 创建一个锁:
lock = multiprocessing.Lock() - 获得一个锁:
lock.acquire([block=True, timeout=None])- 成功获得锁时返回
true blocking为ture时,以阻塞方式获得锁,即要等到锁释放后方能加锁timeout为超时时间,如果设定了timeout,则在超时后不再等待锁,可以通过返回值判断进程是否得到过锁
- 成功获得锁时返回
- 释放一个锁:
lock.release()
对比
threading.Lock() 与 multiprocessing.Lock() 非常相似。
区别在于调用 acquire() 方法的时候,参数上有所的区别:第一个参数的关键字,以及参数的默认值不同,分别为 threading.Lock().acquire(blocking=True, timeout=-1) 和 multiprocessing.Lock().acquire(block=True, timeout=None)
multiprocessing 中的信号量
threading 多线程提供了信号量 threading.Semaphore(),对应的 multiprocessing 多进程中,也提供了信号量 multiprocessing.Semaphore()。多进程和多线程中对信号量的操作相似:
semaphore = multiprocessing.Semaphore(value= 1):创建一个信号量,value指定了资源的数量,默认为 1semaphore.acquire(block=True, timeout=None):从信号量获取一个资源- 当资源数量大于等于1时,资源数量减1,并立即返回
True - 当
block为True且资源为 0 时,线程被阻塞,直到有其他线程释放资源 - 当
block为False且资源为 0 时,直接返回False - 当
timeout不为None时,线程最多被阻塞timeout秒,超时后返回False
- 当资源数量大于等于1时,资源数量减1,并立即返回
semaphore.release():释放一个资源semaphore.get_value():剩余的资源数量
对比
threading.Semaphore() 与 multiprocessing.Semaphore() 同样非常相似。
与互斥锁一样,acquire() 方法中,阻塞参数的参数名有所不同,timeout 的默认值也不同,分别为 threading.Semaphore().acquire(blocking=True, timeout=-1) 和 multiprocessing.Semaphore().acquire(block=True, timeout=None)
在 threading.Semaphore() ,如果想要知道当前还有多少空闲资源,需要访问信号量变量的 _value 属性,而 multiprocessing.Semaphore() 则提供了一个方法 get_value() 来返回这个值。