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

excel常用技巧

一、单元格内快速换行输入:编辑状态下AltEnter 二、单元格设置斜线分割 作为表头,斜线分割还是比较常用的。 1、选中单元格。 2、右键设置单元格格式。 3、在对话框中选择边框标签。 4、选中斜线选项并确定即可。 5、编辑表头,利用AltEnter输…

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

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

day33-进程池和线程池

进程池与线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? # 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机…

【转】常用数学函数篇(Linux c)

abs&#xff08;计算整型数的绝对值&#xff09; 相关函数 labs, fabs 表头文件 #include<stdlib.h> 定义函数 int abs (int j) 函数说明 abs()用来计算参数j的绝对值&#xff0c;然后将结果返回。 返回值 返回参数j的绝对值结果。 范例 #ingclude <stdlib.h> main…

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

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

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

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

Android UI之困 横跨四个屏幕的战争

用户界面&#xff08;UI&#xff09;的话题&#xff0c;总是会带来强烈的争论。这有点像电视领域——每个人都是专家&#xff0c;因为每个人都是用户。早在2002年&#xff0c;电信运营商就有一套自己的UI定制界面——例如Vodafone Live 和 Orange SPV。当然&#xff0c;这遭到很…

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

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

day34 数据库入门

数据库概念 # 1.随意的存到了一个文件中 数据格式也是千差万别的 # 2.软件开发目录规范规定了数据存放的位置ps:数据都是保存在本地的 # 3.将保存数据的部分 存到一个公共的地方 所有的用户涉及到数据相关 都必须来这个公共地方查找 数据库之MySQL # 本质就是一款基于网络通信的…

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

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

09.MyBatis的逆向工程

逆向工程:(通过表自动生成实体类和映射文件) 1.导入mybatis-generator-core-1.3.2.jar的jar包 2.在src下创建并编写配置文件&#xff0c;如下&#xff0c; generator.xml 1 <?xml version"1.0" encoding"UTF-8"?>2 <!DOCTYPE generatorConfigur…

「Luogu5395」【模板】第二类斯特林数·行

「Luogu5395」【模板】第二类斯特林数行 problem Solution 一句话题意&#xff1a;求\(_{i0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\) 根据第二类斯特林数的展开式&#xff0c;有\[\begin{Bmatrix}n\\k\end{Bmatrix}\frac{1}{k!}\sum_{i0}^k(-1)^i\begin{pmatrix}k\\i\end{pmatri…

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

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

day35-mysql之表的详细操作

表操作 1.数据类型 建表的时候&#xff0c;字段都有对应的数据类型 # 整型 # 浮点型 # 字符类型(char与varchar) # 日期类型 # 枚举与集合 2.约束条件 # primary key # unique key # not null 创建表的完整语法&#xff1a; create table 表名( 字段名1 类型[(宽度) 约束条件],…

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

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

卸载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…