day32 并发编程之锁

并发编程之锁

1. GIL全局解释器锁

2. GIL与普通的互斥锁

3. 死锁

4. 信号量

5. event事件

6. 线程q

 

1. GIL全局解释器锁

 

 

"""
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple
native threads from executing Python bytecodes at once. This lock is necessary mainly
because CPython’s memory management is not thread-safe.
"""
"""
ps:python解释器有很多种  最常见的就是Cpython解释器
GIL本质也是一把互斥锁:将并发变成串行牺牲效率保证数据的安全 
用来阻止同一个进程下的多个线程的同时执行(同一个进程内多个线程无法实现并行但是可以实现并发)python的多线程没法利用多核优势  是不是就是没有用了?GIL的存在是因为CPython解释器的内存管理不是线程安全的垃圾回收机制1.引用计数2.标记清除3.分代回收研究python的多线程是否有用需要分情况讨论
四个任务 计算密集型的  10s
单核情况下开线程更省资源
多核情况下开进程 10s开线程 40s四个任务 IO密集型的  
单核情况下开线程更节省资源
多核情况下开线程更节省资源
""""""
python的多线程到底有没有用
需要看情况而定  并且肯定是有用的多进程+多线程配合使用
"""

计算密集型

# 计算密集型
from multiprocessing import Process
from threading import Thread
import os, timedef work():res = 0for i in range(10000000):res *= iif __name__ == '__main__':l = []print(os.cpu_count())  # 本机为8核start = time.time()for i in range(8):p = Process(target=work)  # 耗时  0.7752041816711426# p = Thread(target=work)  # 耗时 2.9953091144561768
        l.append(p)p.start()for p in l:p.join()stop = time.time()print('run time is %s' % (stop - start))

 

I/O密集型
# IO密集型
from multiprocessing import Process
from threading import Thread
import threading
import os,time
def work():time.sleep(2)if __name__ == '__main__':l=[]print(os.cpu_count()) #本机为8核start=time.time()for i in range(4000): # 报错超过最大递归深度,这里改为400p=Process(target=work) #耗时2.85s多,大部分时间耗费在创建进程上# p=Thread(target=work) #耗时2.02s多
        l.append(p)p.start()for p in l:p.join()stop=time.time()print('run time is %s' %(stop-start))

 

 

2. GIL与普通的互斥锁

from threading import Thread
import timen = 100def task():global ntmp = ntime.sleep(1)  # 睡1秒,所有子进程都取到了100,阻塞1秒后再减1,结果为99# 注销了time.sleep(1),GIL锁发挥作用,串行取值,100-100个子程序的1=0n = tmp - 1t_list = []
for i in range(100):t = Thread(target=task)t.start()t_list.append(t)for t in t_list:t.join()print(n)  # 0

 

 

3.死锁

from threading import Thread,Lock,current_thread,RLock
import time
"""
Rlock可以被第一个抢到锁的人连续的acquire和release
每acquire一次锁身上的计数加1
每release一次锁身上的计数减1
只要锁的计数不为0 其他人都不能抢"""
# mutexA = Lock()
# mutexB = Lock()
mutexA = mutexB = RLock()  # A B现在是同一把锁class MyThread(Thread):def run(self):  # 创建线程自动触发run方法 run方法内调用func1 func2相当于也是自动触发
        self.func1()self.func2()def func1(self):mutexA.acquire()print('%s抢到了A锁'%self.name)  # self.name等价于current_thread().name
        mutexB.acquire()print('%s抢到了B锁'%self.name)mutexB.release()print('%s释放了B锁'%self.name)mutexA.release()print('%s释放了A锁'%self.name)def func2(self):mutexB.acquire()print('%s抢到了B锁'%self.name)time.sleep(1)mutexA.acquire()print('%s抢到了A锁' % self.name)mutexA.release()print('%s释放了A锁' % self.name)mutexB.release()print('%s释放了B锁' % self.name)for i in range(10):t = MyThread()t.start()class Demo(object):     passobj1 = Demo()obj2 = Demo()print(id(obj1),id(obj2))
"""
只要类加括号实例化对象
无论传入的参数是否一样生成的对象肯定不一样
单例模式除外自己千万不要轻易的处理锁的问题  """

 

4 信号量

# 信号量可能在不同的领域中 对应不同的知识点
"""
互斥锁:一个厕所(一个坑位)
信号量:公共厕所(多个坑位)
"""
from threading import Semaphore,Thread
import time
import randomsm = Semaphore(5)  # 造了一个含有五个的坑位的公共厕所def task(name):sm.acquire()print('%s占了一个坑位'%name)time.sleep(random.randint(1,3))sm.release()for i in range(40):t = Thread(target=task,args=(i,))t.start()

 

 

5 Event事件

from threading import Event,Thread
import time# 先生成一个event对象
e = Event()def light():print('红灯正亮着')time.sleep(3)e.set()  # 发信号print('绿灯亮了')def car(name):print('%s正在等红灯'%name)e.wait()  # 等待信号print('%s加油门飙车了'%name)t = Thread(target=light)
t.start()for i in range(10):t = Thread(target=car,args=('伞兵%s'%i,))t.start()

 

 

6 线程q

import queue
"""
同一个进程下的多个线程本来就是数据共享 为什么还要用队列因为队列是管道+锁  使用队列你就不需要自己手动操作锁的问题 因为锁操作的不好极容易产生死锁现象
"""# q = queue.Queue()
# q.put('hahha')
# print(q.get())# q = queue.LifoQueue()
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())# q = queue.PriorityQueue()
# # 数字越小 优先级越高
# q.put((10,'haha'))
# q.put((100,'hehehe'))
# q.put((0,'xxxx'))
# q.put((-10,'yyyy'))
# print(q.get())

 

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11351820.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马斯克Neuralink被曝“虐杀实验猴”,140万元美金项目遭谴责

来源: 学术头条作者:刘芳编辑:黄珊2021 年 4 月,马斯克公布了一段猴子用意念玩乒乓球游戏的视频,一时间为他旗下的脑机接口公司 Neuralink 赚足了眼球。然而最近,这些被用来做脑机接口实验的猴子的经历&…

死前真的会有「跑马灯」,人类首次同步测量大脑濒死状态

来源:新智元编辑:袁榭 好困或许,人死前可能真会眼前出现人生跑马灯!最近,神经科学家在记录了一个濒临死亡的人类大脑的活动之后发现,人在死亡前后有节奏的脑电波模式与做梦、回忆记忆和冥想时出现的模式相似…

七牛图片盲水印

注意 暂时不支持从 dora 数据处理直接调该接口,只支持从 kodo 存储调用。即 cdn 域名不可开通图片瘦身调用形式 资源 http://i.iamlj.com/19-08-12/123936.png 处理参数 watermark/6/method/encode/text/aGVsbG8gcWluaXU 新图 http://i.iamlj.com/19-08-12/123936-w…

「最小细胞」的3D数字模型,计算揭示生命最基本的要求

来源:ScienceAI编辑:萝卜皮无论是海洋深处的奇异生物还是我们体内的细菌,地球上的所有生命都是由细胞组成的。但我们对这些细胞中最简单的细胞如何运作只有一个非常粗略的了解。伊利诺伊大学厄巴纳-香槟分校的一个团队创建了有史以来最完整的…

Yann LeCun最新发声:自监督+世界模型,让 AI 像人类与一样学习与推理

来源:AI科技评论作者:维克多、西西、王晔编辑:陈彩娴如何突破当代人工智能(AI)的瓶颈?不同学者存在不同观点。总体来看可以概括为两类,其一监督学习者,提倡通过改善数据标签质量&…

两大头号玩家 一个伟大愿景: 联邦学习的元生态建设美好世界

来源:IEEE标准协会新年伊始,世界领先的标准制定机构IEEE标准协会牵头,组织了2022年度联邦学习领域首场重量级尖峰交流活动——联邦学习首创团队带头人、谷歌研究院副总裁Blaise Agura y Arcas博士,与联邦学习亚洲奠基人、IEEE联邦…

物理学的过去、现在与未来

来源:中科院之声(ID:zkyzswx)、《物理》杂志、中国物理学会期刊网作者:冯端(我国著名物理学家、金属和晶体材料学家、教育家,中国科学院院士、第三世界科学院院士、第五届中国物理学会理事长,南…

《MIT科技评论》:2022年全球十大突破性技术

来源:6G俱乐部资料来源:《麻省理工科技评论》近日,《麻省理工科技评论》2022年“全球十大突破性技术”正式发布。此次发布的突破性技术包括:“新冠口服药”“实用型聚变反应堆”“终结密码”“AI蛋白质折叠”“PoS权益证明”“长时…

PNAS前沿:迈向作为多层学习的进化理论

来源:集智俱乐部作者:郭瑞东编辑:邓一雪导语进化、学习与物理系统的重整化有何相似之处?PNAS的论文“构建将进化视作多层学习的理论”一文,经由统一的理论框架,分析进化过程中的环境预测误差,及…

【前瞻】Nature:2022年7大“颠覆性”技术

来 源:中国科学报 作 者:文乐乐 近日,《自然》对“可能在未来一年对科学产生影响”的7项技术进行了综述。这7项技术分别是完整版基因组、蛋白质结构解析、量子模拟、精准基因组调控、靶向基因疗法、空间多组学、基于CRISPR的诊断。完整版基因…

重磅!Nature子刊发布稳定学习观点论文:建立因果推理和机器学习的共识基础...

来源:AI科技评论整理:AI科技评论2月23日,清华大学计算机系崔鹏副教授与斯坦福大学Susan Athey(美国科学院院士,因果领域国际权威)合作,在全球顶级期刊Nature Machine Intelligence(影…

卸载mysql

先停止所有mysql有关进程。 打开控制台:依次输入以下命令 sudo rm /usr/local/mysqlsudo rm -rf /usr/local/mysql*sudo rm -rf /Library/StartupItems/MySQLCOMsudo rm -rf /Library/PreferencePanes/My*vim /etc/hostconfig and removed the line MYSQLCOM-YES-rm -rf ~/Libr…

​数据集拥有自己的世界观?不,其实还是人的世界观

来源: AI科技评论编译:Antonio编辑:陈彩娴伴随深度学习的不断日常化,数据集中的偏见(bias)和公正性(fairness)已经成为一个热门研究方向。偏见在AI领域是一个很棘手的话题&#xff1…

图灵奖获得者Yann LeCun:未来几十年AI研究的最大挑战是「预测世界模型」

来源:机器学习研究组订阅LeCun 认为,构造自主 AI 需要预测世界模型,而世界模型必须能够执行多模态预测,对应的解决方案是一种叫做分层 JEPA(联合嵌入预测架构)的架构。该架构可以通过堆叠的方式进行更抽象、…

可重构人工智能设备展现出智能化前景

PURDUE UNIVERSITY来源:IEEE电气电子工程师一项新的研究发现,一种适应性强的新设备可以转换成人工智能硬件所需的所有关键电子元件,在机器人和自治系统中有潜在的应用。以大脑为灵感或“神经形态”的计算机硬件旨在模仿人脑从经验中自适应学习…

gin+vue的前后端分离开源项目

该项目是ginvue的前后端分离项目,使用gorm访问MySQL,其中vue前端是使用vue-element-admin框架简单实现的; go后台使用jwt,对API接口进行权限控制。此外,Web页面在token过期后的半个小时内,用户再次操作会自…

day37-数据库分组查询

1. 单表查询 2. 多表查询 ## 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum(male,female) not null default male, #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, …

指挥控制智能化现状与发展

来源:人机与认知实验室0 引言人工智能(AI)技术现已进入一个新的高速增长期,是公认最有可能改变未来世界的颠覆性技术。从“深蓝”战胜卡斯帕罗夫,到机器学习技术在语音识别、图像识别和自然语言处理等诸多…

IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)

2022年网络、计算机和通信国际学术研讨会(International Symposium on Networks, Computers andCommunications,2022)主办:电气与电子工程师学会(IEEE)、IEEE 通信学会(IEEE Communications Society&#x…

【重要征稿】IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)

2022年网络、计算机和通信国际学术研讨会(International Symposium on Networks, Computers andCommunications,2022)主办:电气与电子工程师学会(IEEE)、IEEE 通信学会(IEEE Communications Society&#x…