python封装dll能不能突破线程锁_python中的线程锁

本文详细介绍了Python中的线程锁及其使用方法,包括原始锁、递归锁RLock、条件锁Condition、信号量Semaphore、事件锁Event以及栅栏Barrier。通过示例展示了各种同步机制在多线程环境中的应用,帮助理解如何解决线程间的同步问题。
摘要由CSDN通过智能技术生成

from threading importThread,Lockimportrandom#锁的作用#arr = []#

##原始锁处于 "锁定" 或者 "非锁定" 两种状态之一。它被创建时为非锁定状态。它有两个基本方法, acquire() 和 release() 。当状态为非锁定时, acquire() 将状态改为 锁定 并立即返回。当状态是锁定时, acquire() 将阻塞至其他线程调用 release() 将其改为非锁定状态,然后 acquire() 调用重置其为锁定状态并返回。 release() 只在锁定状态下调用; 它将状态改为非锁定并立即返回。如果尝试释放一个非锁定的锁,则会引发 RuntimeError 异常。#

#l = Lock() # 状态默认是非锁定的#l.acquire()#

#def test1():#l.acquire() # 如果之前的锁是锁定的,再次上锁发生阻塞## 如果之前的锁是非锁定的,可以实现上锁#arr.append(random.randint(1,10))#

#t = Thread(target=test1)#t.start()#

#

#

#def test2():#arr.append(random.randint(1,0))

"""爬取豆瓣电影top250"""

#import requests#import lxml.etree as etree#urls = ["https://movie.douban.com/top250?start=%s"%i for i in range(0,226,25)]#

#class Mytest(Thread):#def __init__(self):#super(Mytest,self).__init__()#def run(self):#while len(urls)>0:#url = urls.pop()#res = requests.get(url).text#html = etree.HTML(res)#titles = html.xpath("//div[@class='hd']/a/span[1]/text()")#print(self.name,titles)#

#for i in range(2):#mytest = Mytest()#mytest.start()

"""向列表中插入元素并打印列表"""

#import time#arr = []#l = Lock()#class Mytest(Thread):#def __init__(self):#super(Mytest,self).__init__()#def run(self):#time.sleep(1)#l.acquire()#arr.append(random.randint(0,10))#print(arr)#l.release()#

#for i in range(20):#t = Mytest()#t.start()

"""递归锁 复用锁 RLock()

在一个线程内可以重复上锁不被阻塞。"""

from threading importRLockimporttime

r=RLock()

l=Lock()deftest1():

r.acquire()

r.acquire()print("123")

time.sleep(2)

r.release()

r.release()deftest2():

r.acquire()print('test2')

t= Thread(target=test1)

t.start()

t2= Thread(target=test2)

t2.start()#死锁#import time#l1 = Lock()#l2 = Lock()#def fun1():#l1.acquire()#print("fun1 is running")#time.sleep(1)#l2.acquire() # 阻塞#print("fun1 is end")#l1.release()#l2.acquire()#def fun2():#l2.acquire()#print("fun2 is running")#l1.acquire() # 阻塞#print("fun2 is end")#l2.release()#l1.release()#

#t1 = Thread(target=fun1)#t1.start()#t2 = Thread(target=fun2)#t2.start()

"""锁的上下文使用方法

向列表中插入元素并打印列表"""

#import time,random#arr = []#l = Lock()#def fun():#time.sleep(1)#with l: # 上锁 自动解锁的功能#arr.append(random.randint(0,10))#print(arr)#

#for i in range(20):#t = Thread(target=fun)#t.start()

"""条件锁

class Condition(lock=RLock) 默认是递归锁

方法:

acquire() 上锁

release() 释放锁

wait(timeout=) 等待(释放锁) 阻塞(等待被通知)

notify(n=) 通知 唤醒n个线程

wait_for(predicate,timeout=) predicate 是一个函数 返回 True False

notify_all() 唤醒所有线程"""

#from threading import Condition#import time#con = Condition(lock=Lock())#

#arr = []#

#class XM(Thread):#def __init__(self):#super(XM,self).__init__()#def run(self):#with con:#while True:#time.sleep(1)#arr.append(1)#length = len(arr)#print("小明添加了1个鱼丸,锅内还有%s个鱼丸"%length)#if length>=5:#con.notify_all()#con.wait()#

#

#class XH(Thread):#def __init__(self,name):#super(XH,self).__init__()#self.name = name#def run(self):#with con:#while True:#time.sleep(1)#arr.pop()#length = len(arr)#print("%s吃了1个鱼丸,锅内还有%s个鱼丸"%(self.name,length))#if length<=0:#con.notify()#con.wait()#

#xm = XM()#xm.start()#

#xh = XH("小红1")#xh.start()#

#xh1 = XH("小红2")#xh1.start()

"""wait_for(predicate,timeout=)

等待 当predicate 返回值为 False 阻塞 当返回值为True 运行

wait() 等待,阻塞 。直到被 notify"""

#from threading import Condition#import time#con = Condition()#con.acquire()#

#def fun():#time.sleep(5)#return True#con.wait_for(fun)#print(123)

"""Semaphore 信号量对象

信号量通常用于保护数量有限的资源,例如数据库服务器。在资源数量固定的任何情况下,都应该使用有界信号量。在生成任何工作线程前,应该在主线程中初始化信号量。"""

#from threading import Semaphore#import time#b = Semaphore(value=3)

#技术面试 每次3个人

#class Ms(Thread):#def __init__(self):#super(Ms,self).__init__()#def run(self):#with b:#print("开始面试,倒计时3秒钟"%self.name)#time.sleep(3)#print("面试结束,有请下一个同学"%self.name)#

#

#for i in range(20):#m = Ms()#m.start()

"""事件锁

is_set() 判断事件锁内部开关是否为true

set() 设置事件锁内部开关为 true

clear() 设置事件锁内部开关为 false

wait() 阻塞 等待事件锁内部开关为true 然后运行"""

#from threading import Event#import time#

#e1 = Event()#e1.set()#

#e2 = Event()#

#arr = []#class XM(Thread):#def __init__(self):#super(XM,self).__init__()#def run(self):#while True:#e1.wait()#time.sleep(1)#arr.append(1)#length = len(arr)#print("小明添加了1个鱼丸,锅内还有%s个鱼丸"%length)#if length>=5:#e1.clear()#e2.set()#

#class XH(Thread):#def __init__(self):#super(XH, self).__init__()#def run(self):#while True:#e2.wait()#time.sleep(1)#arr.pop()#length = len(arr)#print("小红吃了1个鱼丸,锅内还剩%s个鱼丸"%length)#if length<=0:#e2.clear()#e1.set()#

#xm = XM()#xm.start()#xh = XH()#xh.start()

"""定时器对象"""

#import time#def fun():#time.sleep(3)#print("123")#

#fun()#print("开始")

#from threading import Timer## Timer 是一个倒计时线程#def fun():#print("123")#

#t = Timer(3,fun)#t.start()#print("开始")

"""栅栏对象

wait()"""

#from threading import Barrier,active_count#import time# #b = Barrier(5)#l = Lock()# #class Test(Thread):#def __init__(self):#super(Test,self).__init__()#def run(self):#b.wait()#with l:#print("%s 开始运行"%self.name)# #for i in range(20):#time.sleep(2)#t = Test()#with l:#print("创建了%s线程"%t.name)#t.start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值