【问题标题】:Fair semaphore in pythonpython中的公平信号量
【发布时间】:2011-12-30 19:14:22
【问题描述】:

是否有可能在 python 中有一个公平的信号量,保证阻塞线程按照它们调用acquire() 的顺序被解除阻塞?

【问题讨论】:

    标签: python synchronization semaphore


    【解决方案1】:

    您可能必须从其他活动部件中构建一个。例如,创建一个Queue.Queue(),每个听众都会向其中发布一个全新的Event(),然后等待。当需要唤醒其中一个等待线程时,弹出队列中等待时间最长的项目——它将是那些事件对象之一——并通过event.set()释放线程。

    显然,您也可以为每个等待进程使用一个信号量,但我喜欢 Event 的语义,因为它显然只能发生一次,而信号量的语义是它的值可以支持许多等待线程。

    设置系统:

    import Queue
    big_queue = Queue.Queue()
    

    然后,等待:

    import threading
    myevent = threading.Event()
    big_queue.put(myevent)
    myevent.wait()
    

    并释放其中一个等待线程:

    event = big_queue.get()
    event.set()
    

    我想这种方法的弱点是执行设置/释放的线程必须等待等待线程的出现,而真正的信号量即使没有人在等待,也会让多个释放继续进行?

    【讨论】:

    • 我们不能克服你所说的这个限制吗?不可能吗?
    • 我在考虑!出于好奇,如果等待的线程是对称的,为什么“公平”信号量甚至是可取的?随着现代操作系统上内存缓存的工作方式,激活最近最近活动的线程应该是最有效的,而不是等待时间最长的线程,因此最有可能拥有内存块从处理器缓存甚至主内存过期。因此,公平信号量不是反模式吗? :)
    • +1 不错的答案,也是使用更高级别线程工具推理互斥锁的绝佳示例。
    • @brandon 我不这么认为。可能会出现不受欢迎的饥饿问题。例如,像几个等待服务的用户。或者再举一个例子,您有许多类型为 A、B、c、... 您希望随时从每个类别中执行大致相等数量的任务,这可能是因为您需要以某种在线方式对它们进行后处理“数量大致相等”的要求
    【解决方案2】:

    布兰登已经解决了“公平信号量”问题,看看相关的障碍问题可能会很有用,这是线程到达然后同时被释放的等待点:http://docs.python.org/py3k/whatsnew/3.2.html#threading

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多