来都来了,帮我挑个错再走呗,谢谢。
首先先调用多线程的库threading。
import threading我们定义一个类(Buffer),并在构成方法中加入后面需要的参数
class Buffer: def __init__(self,size): self.lock = threading.Rlock self.has_data = threading.Condiction(lock) self.has_pos = threading.Condiction(lock) pos = 0 self.size = size self.buffer = []然后确定程序框架:put、get(初学,目前就这样)
def put(self,data): pass def get(self): pass接着定义一个得到size的方法
def get_size(self): return self.size接着我们开始构建put方法,先放一个小锁,并用with语句做一个异常抛出操作,接着用while语句判断,若self.buffer的长度大于或等于 size,那么就让该线程置于等待状态。反之将数据压入buffer列表,并唤醒其他线程。
def put(self,data): with self.has_pos() while len(self.buffer) >= self.size: self.has_pos.wait() self.buffer.append(data) self.has_data.notify_all()然后再写get方法,get方法和put很类似,不同在于put ,get中while语句判断的是buffer列表的元素数量是否为0,若为零,则是该线程置于入等待状态,反之将buffer列表中第一个元素的值赋给result,并删除第一个元素,并唤醒其他线程。
def get(self): with self.has_data: while len(self.buffer) == 0: self.has_data.wait() else: result = self.buffer[0] del self.buffer[0] self.has_pos.notify_all() return result最后我们给他加一个主程序试一下
if __name__ = '__main__': b = Buffer(4) # s = b.get_size() # bu = b.buffer # s1 = b.size b.put('123') re = b.get() print(re) # re = b.get() # print(re)一开始把唤醒放到了with语句外面报错,和小伙伴研究了很久,发现这个锁吧,必须有依赖关系 完整的代码如下:
import threading class Buffer: def __init__(self,size): self.size = size self.buffer= [] lock = threading.RLock()#Rlock:可反复进入的的lock,一般食用这个 self.has_data = threading.Condition(lock) #Condition:小一点的锁,也有解锁上锁,只不过它依赖于大锁 # self.has.data.wait(self,timeout=None)#有条件等待,也是有条件锁定(单位S)None为永久等待 # self.has_pos.notify_all(self): 唤醒等待 self.has_pos = threading.Condition(lock)#必须依赖同一吧大锁 def get(self): """" Get data from buffer. If the buffer is empty then the current thread(当前线程) is blocked(受阻) until there is at least one data available. :return """ with self.has_data: while len(self.buffer) == 0: self.has_data.wait() result = self.buffer[0] del self.buffer[0] self.has_pos.notify_all() return result def get_size(self): return self.size def put(self,data): """ Put the data into this buffer ,The current thread is blocked if the buffer is fuil. :param data: :return: the data :param self: :return: the data """ with self.has_pos: while len(self.buffer) >= self.size: self.has_pos.wait() self.buffer.append(data) # self.has_data.notify_all()#因为有等在另外条件上的线程等待数据,该操作把等待线程激活 if __name__ == '__main__': b = Buffer(4) # s = b.get_size() # bu = b.buffer # s1 = b.size b.put('123') re = b.get() print(re) # re = b.get() # print(re)结果就是这样了