深度学习之初入多线程操作

    技术2022-07-11  112

    深度学习之初入多线程操作

    来都来了,帮我挑个错再走呗,谢谢。

    首先先调用多线程的库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)

    结果就是这样了

    Processed: 0.012, SQL: 10