如何判断python中的信号量是否已满

如何判断python中的信号量是否已满,python,semaphore,Python,Semaphore,我有一个有界信号量对象,确保我的程序一次下载的文件不会超过一定数量。每个工作线程在开始下载时获取信号量,下载完成后释放信号量 我有另一个线程,希望在没有下载任何内容时运行代码。我想要一个锁定方法,直到信号量完全可用。在Python中如何做到这一点?我不确定是否完全理解了它,但您认为下面的代码可以工作吗 from threading import Semaphore p = Semaphore(5) #Allow 5 times p.acquire() download_file() ... ..

我有一个有界信号量对象,确保我的程序一次下载的文件不会超过一定数量。每个工作线程在开始下载时获取信号量,下载完成后释放信号量


我有另一个线程,希望在没有下载任何内容时运行代码。我想要一个锁定方法,直到信号量完全可用。在Python中如何做到这一点?

我不确定是否完全理解了它,但您认为下面的代码可以工作吗

from threading import Semaphore
p = Semaphore(5) #Allow 5 times
p.acquire()
download_file()
...
...

在这段代码中,p.acquire()将返回True 5次,然后导致调用阻塞。封锁电话不会满足你的目的吗?

< P>一批工作人员听起来像是一个很好的解决方案,所以你可以考虑一下。您可以创建工作人员池,提交所有作业、工作池,然后等待事情完成,然后在下载完文件后交给要运行的代码。

您绝对不应该试图窥视信号量的计数器值。这样做会破坏信号量的抽象。此外,您读取的值甚至可能不是正确的值,因为,一个-可能有另一个线程可以在您实际使用读取值之前更改计数的值(取决于调度策略);第二,你的阅读不是原子的。因此,黑客攻击可能会奏效,但并不一定会一直奏效


更好的做法是在程序中使用计数器变量。但是应该注意同步对该计数器的访问。

这听起来更像是希望加入线程而不是使用信号量。我同时下载了不同的线程。每个人在下载之前获取信号量,然后释放信号量。我想阻止,直到目前没有其他线程获取信号量。我能想到的唯一方法是拥有一个全局变量计数,然后在每个线程中拥有一个单独的锁,用于同步此变量。当线程获取信号量时,它将增加计数,当释放时,它将减少计数。在第三个线程中,您将检查count的值。您只想在
count
为0时获取,对吗?希望能有帮助。谢谢你的链接。pool对象听起来既实用又相关。我在学术上仍然对主要问题感兴趣。如何判断所有信号量是否都可用?@user831850对REPL进行一点检查表明,至少在CPython 2.6中,有一个“private”属性:
\u信号量\u值
是信号量内部使用的计数器。您可以将它的当前值与原始值进行比较(我想您可能在某处闲逛过),不过您可能需要做一些工作,以确保所有内容都是原子的。不过,这听起来像是一个大黑客,所以可能我遗漏了一些更明显的东西。大概我也想获得“private”lock对象。这就是我最初想到的黑客行为。我想我一定错过了什么,所以我问了这个问题。