我有一个有界的信号量对象,可以确保我的程序一次不下载超过一定数量的文件。每个工作线程在开始下载时获取信号量,并在完成时释放它。
我有另一个线程想要在没有下载任何内容时运行代码。我想要一种锁定方法,直到信号量完全可用。我怎么能用Python做到这一点?
答案 0 :(得分:3)
一群工人听起来是一个很好的解决方案,所以你可以考虑this question and its answers。您可以创建工作池,提交所有作业,close
池,然后join
它等待事情完成,然后在文件完成时切换到要运行的代码下载。
答案 1 :(得分:1)
你绝对不应该试着查看信号量的计数器值。这样做打破了信号量的抽象。此外,您读取的值可能甚至不是正确的值,因为,一个 - 可能有另一个线程可以在您实际使用读取值之前更改计数值(取决于调度策略);二 - 你的阅读不是原子的。所以黑客攻击可能会起作用,但不能保证一直都能正常工作。
更好的办法是在程序中使用计数器变量。但应注意同步对此计数器的访问。
答案 2 :(得分:0)
我不确定,如果我完全理解它,但您认为以下代码是否有效?
from threading import Semaphore
p = Semaphore(5) #Allow 5 times
p.acquire()
download_file()
...
...
在此代码中,p.acquire()将返回True 5次,然后将导致调用阻塞。阻止电话会不会满足你的目的?