6

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

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

4

3 回答 3

3

一群工人听起来是一个很好的解决方案,所以你可以考虑这个问题及其答案。您可以创建工作人员池,提交所有作业,close池,然后join等待事情完成,然后在文件下载完成后移交给您要运行的代码。

于 2012-07-11T19:17:17.963 回答
1

您绝对不应该尝试查看信号量的计数器值。这样做会破坏信号量的抽象。此外,您读取的值甚至可能不是正确的值,因为,一个 - 可能有另一个线程可以在您实际使用读取值之前更改计数值(取决于调度策略);二 - 你的阅读不是原子的。所以到处乱砍可能会奏效,但不能保证一直有效。

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

于 2012-09-26T11:27:52.723 回答
0

我不确定,如果我完全理解它,但你认为下面的代码会起作用吗?

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

在此代码中,p.acquire() 将返回 True 5 次,然后将导致调用阻塞。阻塞呼叫不足以满足您的目的吗?

于 2012-07-11T19:16:30.077 回答