【问题标题】:how to tell if a semaphore is full in python如何判断python中的信号量是否已满
【发布时间】:2012-07-11 11:39:46
【问题描述】:

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

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

【问题讨论】:

  • 这听起来更像是您想要加入线程而不是使用信号量的情况。

标签: python semaphore


【解决方案1】:

一个工人池听起来是一个很好的解决方案,所以你可以考虑this question and its answers。您可以创建工人池,提交所有作业,close 池,然后 join 它等待事情完成,然后在文件下载完成后移交给您要运行的代码。

【讨论】:

  • 感谢您的链接。池对象听起来实用且相关。我仍然对主要问题在学术上感兴趣。如何判断是否所有信号量都可用?
  • @user831850 对 REPL 的一点检查表明,至少在 CPython 2.6 中,有一个“私有”属性:_Semaphore__value,它是信号量内部使用的计数器。您可以将它的当前值与原始值进行比较(我假设您已经在某处闲逛),尽管您可能需要做一些工作以确保一切都是原子的。不过,这听起来像是一个大技巧,所以也许我遗漏了一些更明显的东西。
  • 大概我也想获得“私人”锁定对象。这就是我最初一直在考虑的 hack。我想我一定错过了什么,所以我问了这个问题。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我有单独的线程同时下载。每个人在下载前获取信号量,然后释放信号量。我想阻塞,直到当前没有其他线程获得信号量。
    • 我能想到的唯一方法是有一个全局变量count,然后在每个线程中,有一个单独的锁用于同步这个变量。当线程获取信号量时,它会增加计数,当释放时,它会减少计数。在第三个线程中,您将检查计数值。您只想在 count 为 0 时获取,对吗?希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2010-12-20
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多