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

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

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

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

结果就是这样了
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值