.Semaphore() 和 .BoundedSemaphore() 有什么区别?
What is the difference between .Semaphore() and .BoundedSemaphore()?
我知道threading.Lock()
等于threading.Semaphore(1)
。
threading.Lock()
是否也等于threading.BoundedSemaphore(1)
?
而且我最近看到threading.BoundedSemaphore()
,它们有什么区别?例如在以下代码片段中(对线程应用限制):
import threading
sem = threading.Semaphore(5)
sem = threading.BoundedSemaphore(5)
A Semaphore
可以释放的次数多于获得的次数,这会将其计数器提高到起始值之上。 A BoundedSemaphore
can't 高于起始值。
from threading import Semaphore, BoundedSemaphore
# Usually, you create a Semaphore that will allow a certain number of threads
# into a section of code. This one starts at 5.
s1 = Semaphore(5)
# When you want to enter the section of code, you acquire it first.
# That lowers it to 4. (Four more threads could enter this section.)
s1.acquire()
# Then you do whatever sensitive thing needed to be restricted to five threads.
# When you're finished, you release the semaphore, and it goes back to 5.
s1.release()
# That's all fine, but you can also release it without acquiring it first.
s1.release()
# The counter is now 6! That might make sense in some situations, but not in most.
print(s1._value) # => 6
# If that doesn't make sense in your situation, use a BoundedSemaphore.
s2 = BoundedSemaphore(5) # Start at 5.
s2.acquire() # Lower to 4.
s2.release() # Go back to 5.
try:
s2.release() # Try to raise to 6, above starting value.
except ValueError:
print('As expected, it complained.')
线程模块提供了简单的Semaphore
class。
A Semaphore
提供了一个 non-bounded 计数器,它允许您调用 release()
任意次数来递增。
但是,为了避免编程错误,使用 BoundedSemaphore
通常是正确的选择,如果 release()
调用试图将计数器增加到超过其最大大小,则会引发错误。
编辑
信号量有一个内部计数器而不是锁定标志(在锁的情况下),并且它只会在超过给定数量的线程试图持有信号量时阻塞。根据信号量的初始化方式,这允许多个线程同时访问同一代码段。
我知道threading.Lock()
等于threading.Semaphore(1)
。
threading.Lock()
是否也等于threading.BoundedSemaphore(1)
?
而且我最近看到threading.BoundedSemaphore()
,它们有什么区别?例如在以下代码片段中(对线程应用限制):
import threading
sem = threading.Semaphore(5)
sem = threading.BoundedSemaphore(5)
A Semaphore
可以释放的次数多于获得的次数,这会将其计数器提高到起始值之上。 A BoundedSemaphore
can't 高于起始值。
from threading import Semaphore, BoundedSemaphore
# Usually, you create a Semaphore that will allow a certain number of threads
# into a section of code. This one starts at 5.
s1 = Semaphore(5)
# When you want to enter the section of code, you acquire it first.
# That lowers it to 4. (Four more threads could enter this section.)
s1.acquire()
# Then you do whatever sensitive thing needed to be restricted to five threads.
# When you're finished, you release the semaphore, and it goes back to 5.
s1.release()
# That's all fine, but you can also release it without acquiring it first.
s1.release()
# The counter is now 6! That might make sense in some situations, but not in most.
print(s1._value) # => 6
# If that doesn't make sense in your situation, use a BoundedSemaphore.
s2 = BoundedSemaphore(5) # Start at 5.
s2.acquire() # Lower to 4.
s2.release() # Go back to 5.
try:
s2.release() # Try to raise to 6, above starting value.
except ValueError:
print('As expected, it complained.')
线程模块提供了简单的Semaphore
class。
A Semaphore
提供了一个 non-bounded 计数器,它允许您调用 release()
任意次数来递增。
但是,为了避免编程错误,使用 BoundedSemaphore
通常是正确的选择,如果 release()
调用试图将计数器增加到超过其最大大小,则会引发错误。
编辑
信号量有一个内部计数器而不是锁定标志(在锁的情况下),并且它只会在超过给定数量的线程试图持有信号量时阻塞。根据信号量的初始化方式,这允许多个线程同时访问同一代码段。