临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。
锁机制
threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.lock = threading.Lock()def add(self):
self.lock.acquire()#加锁,锁住相应的资源
self.num += 1
num = self.num
self.lock.release()#解锁,离开该资源
return num
n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = itemdef run(self):
time.sleep(2)
value = n.add()#将num加1,并输出原来的数据和+1之后的数据
print(self.item,value)for item in range(5):
t = jdThread(item)
t.start()
t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728
当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念)。
直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。
信号量
信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.sem = threading.Semaphore(value = 3)#允许最多三个线程同时访问资源
def add(self):
self.sem.acquire()#内部计数器减1
self.num += 1
num = self.num
self.sem.release()#内部计数器加1
return num
n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = itemdef run(self):
time.sleep(2)
value = n.add()
print(self.item,value)for item in range(100):
目前开设python培训的机构不占少数,学习方式多样化。但最关键的还是培训机构的整体质量,有很多培训课程体系专业,但课堂内容却差强人意,所以很多python培训机构合作企业质量参差不齐。Python培训的话,推荐你选择北京千锋教育,讲的详细,通俗易懂。首先,千锋教育在北京,这是国家的政治、经济和科技中心,很多高新技术会在这里产生,眼界打开了,自己的格局才能打开。其次,配备资深讲师。优质的教学,专业的教师阵容,可独立研发教学课程。名师出高徒,专业的老师才能教出优秀的学生。课程周期:科学完善的课程体系,将尖端技术完美融入课程,实用性才更强。就业指导:分析市场就业情形给予准确分析,促进学员高质量就业,对内注重学员职业技能和就业素质的提升,对外注重企业合作。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,是一家性价比极高的教育机构
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)