我有一些函数可以写一些文件。信号量用于将线程数限制为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()
答案 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)
我必须反对接受的问题。确实Condition
将wait
排队,但更重要的部分是它尝试acquire the Condition
lock时。
发布帖子的顺序是not deterministic
实现可以随机选择一个,因此不应该依赖被阻止的线程被唤醒的顺序。
在三个线程的情况下,我同意,两个人不太可能同时获得锁定(一个工作,一个在wait
,一个获得锁定),但仍然可能是干扰。
解决问题的好方法IMO将是一个线程,其唯一目的是从队列中读取数据并将其写入文件。所有其他线程都可以写入队列并继续工作。