本篇文章给大家带来的内容是关于Python中四种锁的使用示例(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
Lock互斥锁
使用前
num = 0 def a(): global num for _ in range(10000000): num += 1 def b(): global num for _ in range(10000000): num += 1 if __name__ == '__main__': t1=Thread(target=a) t1.start() t2=Thread(target=b) t2.start() t1.join() t2.join() print(num) #基本永远会小于20000000
使用后
num = 0 def a(lock): global num for _ in range(1000000): with lock: num += 1 def b(lock): global num for _ in range(1000000): with lock: num += 1 if __name__ == '__main__': lock = threading.Lock() t1=Thread(target=a, args=(lock,)) t1.start() t2=Thread(target=b, args=(lock,)) t2.start() t1.join() t2.join() print(num) #永远会输出20000000
RLock重用锁
#在之前的代码中永远不可能出现锁在没释放之前重新获得锁,但rlock可以做到,但只能发生在一个线程中,如: num = 0 def a(lock): with lock: print("我是A") b(lock) def b(lock): with lock: print("我是b") if __name__ == '__main__': lock = threading.Lock() t1 = Thread(target=a, args=(lock,)) t1.start() #会发生死锁,因为在第一次还没释放锁后,b就准备上锁,并阻止a释放锁
使用后
if __name__ == '__main__': lock = threading.RLock() #只需要改变锁为RLock程序马上恢复 t1 = Thread(target=a, args=(lock,)) t1.start()
Condition同步锁
#这个程序我们模拟甲乙对话 Jlist = ["在吗", "干啥呢", "去玩儿不", "好吧"] Ylist = ["在呀", "玩儿手机", "不去"] def J(list): for i in list: print(i) time.sleep(0.1) def Y(list): for i in list: print(i) time.sleep(0.1) if __name__ == '__main__': t1 = Thread(target=J, args=(Jlist,)) t1.start() t1.join() t2 = Thread(target=Y, args=(Ylist,)) t2.start() t2.join() #上面的程序输出后发现效果就是咱们想要的,但是我们每次输出后都要等待0.1秒,也无法正好确定可以拿到时间片的最短时间值,并且不能保证每次正好都是另一个线程执行。因此,我们用以下方式,完美解决这些问题。
使用后
Jlist = ["在吗", "干啥呢", "去玩儿不", "好吧"] Ylist = ["在呀", "玩儿手机", "不去","哦"] def J(cond, list): for i in list: with cond: print(i) cond.notify() cond.wait() def Y(cond, list): for i in list: with cond: cond.wait() print(i) cond.notify() if __name__ == '__main__': cond = threading.Condition() t1 = Thread(target=J, args=(cond, Jlist)) t2 = Thread(target=Y, args=(cond, Ylist)) t2.start() t1.start() #一定保证t1启动在t2之后,因为notify发送的信号要被t2接受到,如果t1先启动,会发生阻塞。
Seamplore信号量
使用前
class B(threading.Thread): def __init__(self, name): super().__init__() self.name = name def run(self): time.sleep(1) print(self.name) class A(threading.Thread): def __init__(self): super().__init__() def run(self): for i in range(100): b = B(i) b.start() if __name__ == '__main__': a = A() a.start() #执行后发现不断在输出
使用后
class B(threading.Thread): def __init__(self, name, sem): super().__init__() self.name = name self.sem = sem def run(self): time.sleep(1) print(self.name) sem.release() class A(threading.Thread): def __init__(self, sem): super().__init__() self.sem = sem def run(self): for i in range(100): self.sem.acquire() b = B(i, self.sem) b.start() if __name__ == '__main__': sem = threading.Semaphore(value=3) a = A(sem) a.start() #通过执行上面的代码,我们发现一次只能输出三个数字,sem控制访问并发量
以上是Python中四种锁的使用示例(代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

Python列表切片的基本语法是list[start:stop:step]。1.start是包含的第一个元素索引,2.stop是排除的第一个元素索引,3.step决定元素之间的步长。切片不仅用于提取数据,还可以修改和反转列表。

ListSoutPerformarRaysin:1)DynamicsizicsizingandFrequentInsertions/删除,2)储存的二聚体和3)MemoryFeliceFiceForceforseforsparsedata,butmayhaveslightperformancecostsinclentoperations。

toConvertapythonarraytoalist,usEthelist()constructororageneratorexpression.1)intimpthearraymoduleandcreateanArray.2)USELIST(ARR)或[XFORXINARR] to ConconverTittoalist,请考虑performorefformanceandmemoryfformanceandmemoryfformienceforlargedAtasetset。

choosearraysoverlistsinpythonforbetterperformanceandmemoryfliceSpecificScenarios.1)largenumericaldatasets:arraysreducememoryusage.2)绩效 - 临界杂货:arraysoffersoffersOffersOffersOffersPoostSfoostSforsssfortasssfortaskslikeappensearch orearch.3)testessenforcety:arraysenforce:arraysenforc

在Python中,可以使用for循环、enumerate和列表推导式遍历列表;在Java中,可以使用传统for循环和增强for循环遍历数组。1.Python列表遍历方法包括:for循环、enumerate和列表推导式。2.Java数组遍历方法包括:传统for循环和增强for循环。

本文讨论了Python版本3.10中介绍的新“匹配”语句,该语句与其他语言相同。它增强了代码的可读性,并为传统的if-elif-el提供了性能优势

Python中的功能注释将元数据添加到函数中,以进行类型检查,文档和IDE支持。它们增强了代码的可读性,维护,并且在API开发,数据科学和图书馆创建中至关重要。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver CS6
视觉化网页开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。