如何知道 python 信号量值
how to know python semaphore value
我在我的代码中使用 threading.semaphore,我想知道我是否可以使用像这样的代码
if(sema.acquire()!=True):
#do Somthing
我想在循环中使用这段代码,所以我需要知道信号量是被占用还是被释放
或者在我的代码中使用这样的代码
if(sema.get_value!=1):
#do something
我阅读了这篇文档,但找不到我的答案
https://docs.python.org/3/library/threading.html
信号量是围绕这样的想法设计的,即线程只获取一个,然后等待它可用,因为获取信号量的顺序并不能真正预测。
计数器不是名为 'Semaphore' 的抽象的一部分。不能保证您对信号量计数器的访问是原子的。如果您可以窥视计数器,并且另一个线程在您对它执行任何操作之前获取了该信号量,您应该怎么做?
如果不破坏您的代码,您就无法知道其中的价值。
您可以使用
if(sema.acquire(blocking=False)):
# Do something with lock taken
sema.release()
else:
# Do something in case when lock is taken by other
这种机制对于避免复杂情况下的死锁很有用,但也可以用于其他目的。
其他答案是正确的,但是对于谁访问此页面以便真正知道如何获取信号量值,您可以这样做:
>>> from threading import Semaphore
>>> sem = Semaphore(5)
>>> sem._Semaphore__value
5
>>> sem.acquire()
True
>>> sem._Semaphore__value
4
请注意 变量名称前的 _Semaphore__
value
表示这是一个实现细节。不要基于此变量编写生产代码,因为它将来可能会发生变化。此外,请勿尝试手动编辑该值,否则......可能会发生任何不好的事情。
在python3.6中,可以这样得到:
from threading import Semaphore
sem = Semaphore(5)
print(sem._value)
这个值对调试很有用
您可以考虑改用 threading.Condition()。例如:
import threading
class ConditionalSemaphore(object):
def __init__(self, max_count):
self._count = 0
self._max_count = max_count
self._lock = threading.Condition()
@property
def count(self):
with self._lock:
return self._count
def acquire(self):
with self._lock:
while self._count >= self._max_count:
self._lock.wait()
self._count += 1
def release(self):
with self._lock:
self._count -= 1
self._lock.notify()
我在我的代码中使用 threading.semaphore,我想知道我是否可以使用像这样的代码
if(sema.acquire()!=True):
#do Somthing
我想在循环中使用这段代码,所以我需要知道信号量是被占用还是被释放 或者在我的代码中使用这样的代码
if(sema.get_value!=1):
#do something
我阅读了这篇文档,但找不到我的答案 https://docs.python.org/3/library/threading.html
信号量是围绕这样的想法设计的,即线程只获取一个,然后等待它可用,因为获取信号量的顺序并不能真正预测。
计数器不是名为 'Semaphore' 的抽象的一部分。不能保证您对信号量计数器的访问是原子的。如果您可以窥视计数器,并且另一个线程在您对它执行任何操作之前获取了该信号量,您应该怎么做?
如果不破坏您的代码,您就无法知道其中的价值。
您可以使用
if(sema.acquire(blocking=False)):
# Do something with lock taken
sema.release()
else:
# Do something in case when lock is taken by other
这种机制对于避免复杂情况下的死锁很有用,但也可以用于其他目的。
其他答案是正确的,但是对于谁访问此页面以便真正知道如何获取信号量值,您可以这样做:
>>> from threading import Semaphore
>>> sem = Semaphore(5)
>>> sem._Semaphore__value
5
>>> sem.acquire()
True
>>> sem._Semaphore__value
4
请注意 变量名称前的 _Semaphore__
value
表示这是一个实现细节。不要基于此变量编写生产代码,因为它将来可能会发生变化。此外,请勿尝试手动编辑该值,否则......可能会发生任何不好的事情。
在python3.6中,可以这样得到:
from threading import Semaphore
sem = Semaphore(5)
print(sem._value)
这个值对调试很有用
您可以考虑改用 threading.Condition()。例如:
import threading
class ConditionalSemaphore(object):
def __init__(self, max_count):
self._count = 0
self._max_count = max_count
self._lock = threading.Condition()
@property
def count(self):
with self._lock:
return self._count
def acquire(self):
with self._lock:
while self._count >= self._max_count:
self._lock.wait()
self._count += 1
def release(self):
with self._lock:
self._count -= 1
self._lock.notify()