防止线程饥饿Python

时间:2015-07-02 14:13:09

标签: python multithreading queue

我有一些函数可以写一些文件。信号量用于将线程数限制为2.线程总数为3.如何防止3个线程出现饥饿?队列是一个选项吗?

import time
import threading

sema = threading.Semaphore(2)


def write_file(file,data):
    sema.acquire()
    try:
        f=open(file,"a")
        f.write(data)
        f.close()
    finally:
        sema.release()

2 个答案:

答案 0 :(得分:1)

如果线程正在等待获取信号量,则其他两个线程中的任何一个都将完成写入并释放信号量。

如果您担心如果正在进行大量写入,则编写者可能会在等待线程通知之前重新获取信号量。我认为这不可能发生。

Python(2.7)中的Semaphore对象使用Condition。条件将等待线程(实际上是等待线程阻塞的锁)添加到def wait(self, timeout=None): self.__waiters.append(waiter) ... def notify(self, n=1): ... waiters = self.__waiters[:n] for waiter in waiters: waiter.release() ... 列表的末尾,并在通知线程时notified threads are taken from the beginning of the list。因此该列表就像一个FIFO队列。

它看起来像这样:

NSTimer

在阅读source code后,我的理解是Python的信号量是FIFO。我无法找到关于此的任何其他信息,所以如果我错了,请纠正我。

答案 1 :(得分:1)

我必须反对接受的问题。确实Conditionwait排队,但更重要的部分是它尝试acquire the Condition lock时。

发布帖子的顺序是not deterministic

  

实现可以随机选择一个,因此不应该依赖被阻止的线程被唤醒的顺序。

在三个线程的情况下,我同意,两个人不太可能同时获得锁定(一个工作,一个在wait,一个获得锁定),但仍然可能是干扰。

解决问题的好方法IMO将是一个线程,其唯一目的是从队列中读取数据并将其写入文件。所有其他线程都可以写入队列并继续工作。