深度学习之初入多线程操作
来都来了,帮我挑个错再走呗,谢谢。
首先先调用多线程的库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)
结果就是这样了