防止线程不足Python

2024-06-09 04:59:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,可以写一些文件。信号量用于将线程数限制为2。线程总数为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()

Tags: 文件函数importdatatime线程filewrite
2条回答

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

如果您担心正在进行大量的写操作,编写器可能会在通知等待线程之前重新获取信号量。我想这不可能发生。在

Python(2.7)中的Semaphore对象使用^{}。该条件将等待线程(实际上是一个锁,等待线程正在阻塞它)添加到waiters列表的末尾,当通知线程时,notified threads are taken from the beginning of the list。所以这个列表就像一个FIFO队列。在

看起来像这样:

def wait(self, timeout=None):
    self.__waiters.append(waiter)
    ...

def notify(self, n=1):
    ...
    waiters = self.__waiters[:n]
    for waiter in waiters:
        waiter.release()
    ...

在阅读了source code之后,我的理解是Python的信号量是FIFO。我找不到这方面的任何其他信息,所以如果我错了,请纠正我。在

我不得不反对这个公认的问题。确实,Conditionwait排队,但更重要的部分是当它试图acquire the ^{} lock时。在

线程的释放顺序是not deterministic

The implementation may pick one at random, so the order in which blocked threads are awakened should not be relied on.

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

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

相关问题 更多 >