【发布时间】:2012-07-11 11:39:46
【问题描述】:
我有一个有界信号量对象,可确保我的程序一次不会下载超过一定数量的文件。每个工作线程在开始下载时获取信号量,并在完成时释放它。
我有另一个线程想在没有下载任何内容时运行代码。我想要一种锁定方法,直到信号量完全可用。如何在 Python 中做到这一点?
【问题讨论】:
-
这听起来更像是您想要加入线程而不是使用信号量的情况。
我有一个有界信号量对象,可确保我的程序一次不会下载超过一定数量的文件。每个工作线程在开始下载时获取信号量,并在完成时释放它。
我有另一个线程想在没有下载任何内容时运行代码。我想要一种锁定方法,直到信号量完全可用。如何在 Python 中做到这一点?
【问题讨论】:
一个工人池听起来是一个很好的解决方案,所以你可以考虑this question and its answers。您可以创建工人池,提交所有作业,close 池,然后 join 它等待事情完成,然后在文件下载完成后移交给您要运行的代码。
【讨论】:
_Semaphore__value,它是信号量内部使用的计数器。您可以将它的当前值与原始值进行比较(我假设您已经在某处闲逛),尽管您可能需要做一些工作以确保一切都是原子的。不过,这听起来像是一个大技巧,所以也许我遗漏了一些更明显的东西。
您绝对不应该试图窥探信号量的计数器值。这样做会破坏信号量的抽象。此外,您读取的值甚至可能不是正确的值,因为,一个 - 可能有另一个线程可以在您实际使用读取值之前更改计数值(取决于调度策略);二 - 你的阅读不是原子的。因此,到处乱砍可能会奏效,但不能保证一直有效。
更好的做法是在程序中使用计数器变量。但应注意同步访问此计数器。
【讨论】:
我不确定,如果我完全理解它,但你认为下面的代码会起作用吗?
from threading import Semaphore
p = Semaphore(5) #Allow 5 times
p.acquire()
download_file()
...
...
在此代码中,p.acquire() 将返回 True 5 次,然后将导致调用阻塞。阻塞调用不足以满足您的目的吗?
【讨论】:
count 为 0 时获取,对吗?希望对您有所帮助。