「这是我参与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()
来返回这个值。