2024-06-09 04:59:17 发布
网友
我有一个函数,可以写一些文件。信号量用于将线程数限制为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()
如果一个线程正在等待获取信号量,那么其他两个线程中的任何一个都将完成写入并释放信号量。在
如果您担心正在进行大量的写操作,编写器可能会在通知等待线程之前重新获取信号量。我想这不可能发生。在
Python(2.7)中的Semaphore对象使用^{}。该条件将等待线程(实际上是一个锁,等待线程正在阻塞它)添加到waiters列表的末尾,当通知线程时,notified threads are taken from the beginning of the list。所以这个列表就像一个FIFO队列。在
waiters
看起来像这样:
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。我找不到这方面的任何其他信息,所以如果我错了,请纠正我。在
我不得不反对这个公认的问题。确实,Condition将wait排队,但更重要的部分是当它试图acquire the ^{} lock时。在
Condition
wait
线程的释放顺序是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对于您的问题的一个好的解决方案是一个线程,它的唯一目的是从队列中读取数据并将其写入文件。所有其他线程都可以写入队列并继续工作。在
如果一个线程正在等待获取信号量,那么其他两个线程中的任何一个都将完成写入并释放信号量。在
如果您担心正在进行大量的写操作,编写器可能会在通知等待线程之前重新获取信号量。我想这不可能发生。在
Python(2.7)中的Semaphore对象使用^{} 。该条件将等待线程(实际上是一个锁,等待线程正在阻塞它)添加到
waiters
列表的末尾,当通知线程时,notified threads are taken from the beginning of the list。所以这个列表就像一个FIFO队列。在看起来像这样:
在阅读了source code之后,我的理解是Python的信号量是FIFO。我找不到这方面的任何其他信息,所以如果我错了,请纠正我。在
我不得不反对这个公认的问题。确实,} lock 时。在
Condition
将wait
排队,但更重要的部分是当它试图acquire the ^{线程的释放顺序是not deterministic
在三个线程的情况下,我同意,两个线程不太可能同时获得锁(一个在工作,一个在
wait
中,一个获得锁),但是仍然可能存在干扰。在IMO对于您的问题的一个好的解决方案是一个线程,它的唯一目的是从队列中读取数据并将其写入文件。所有其他线程都可以写入队列并继续工作。在
相关问题 更多 >
编程相关推荐