备案 控制台
开发者社区 开发与运维 文章 正文

python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(2)

简介: python 线程 ~~ ~~~为面试开辟VIP通道~~~~~测试、死锁、全局变量共享、守护主线程等。。。。。。(2)

5、线程之间共享全局变量

# TODO 线程之间共享全局变量
import threading
import time
my_list=[]
#写入数据
def write_data():
    for i in range(5):
        my_list.append(i)
        time.sleep(0.1)
    print("write_data",my_list)
# 读取数据
def read_data():
    print("read_data",my_list)
if __name__ == '__main__':
    #  创建写入数据线程
    write_dataThred=threading.Thread(target=write_data)
    # 创建读取数据线程
    read_dataThred=threading.Thread(target=read_data)
    #开启进程
    write_dataThred.start()
    # 主线程等待写入线程执行完成以后代码再继续往下执行
    write_dataThred.join()# 等待子线程执行之后再执行下一次代码,不加这行你会发现read_data  读不到数据
    print("开始读取数据")

结果:image.pngread_data 哪去了??????image.png从上图可以发现只要重新启动read_dataThred线程就可以了你难道认为这样就可以了吗,太天真了。-_-下面再引入一个例子。

# TODO 线程之间共享全局变量出现问题     问题:线程不一致,交替拿变量      解决方法     保持线程同步,同一时刻只能有一个线程去操作全局变量    两种方式   线程等待  +  互斥所
import threading
#  创建函数,实现循环100万次,每次全局变量加一
g_num=0
# 每次全局变量加一
def sun_num():
    for i in range(1000000):
        global g_num
        g_num+=1
    print("sun_num",g_num)
# 每次全局变量加一
def sun_num2():
    for i in range(1000000):
        global g_num
        g_num+=1
    print("sun_num2", g_num)
if __name__ == '__main__':
    sun_numThred=threading.Thread(target=sun_num)
    sun_num2Thred=threading.Thread(target=sun_num2)
    #开启线程
    sun_numThred.start()
    sun_num2Thred.start()

结果:image.pngimage.png结果是出结果了,但是你们细看一下代码,你们不感觉这个答案有问题吗?有没有这样一个疑问,for循环,遍历共享变量,最后应该是1000000和2000000啊,怎么打印出来的是1000000和1456202,而且细心的你还会发现每次的大男孩不一样。想要解决问题应该怎么办呢?问题总结:线程不一致,交替拿变量 解决方法 保持线程同步,同一时刻只能有一个线程去操作全局变量 两种方式 线程等待 + 互斥所线程等待:join出场ticle/details/123494962

# TODO 线程之间共享全局变量出现问题     问题:线程不一致,交替拿变量      解决方法     保持线程同步,同一时刻只能有一个线程去操作全局变量    两种方式   线程等待  +  互斥所
import threading
#  创建函数,实现循环100万次,每次全局变量加一
g_num=0
# 每次全局变量加一
def sun_num():
    for i in range(1000000):
        global g_num
        g_num+=1
    print("sun_num",g_num)
# 每次全局变量加一
def sun_num2():
    for i in range(1000000):
        global g_num
        g_num+=1
    print("sun_num2", g_num)
if __name__ == '__main__':
    sun_numThred=threading.Thread(target=sun_num)
    sun_num2Thred=threading.Thread(target=sun_num2)
    #开启线程
    sun_numThred.start()
    # # TODO 方法一
    sun_numThred.join()
    sun_num2Thred.start()

结果:image.png线程等待,当前线程等待其他线程执行某些操作,典型场景就是生产者消费者模式,在任务条件不满足时,等待其他线程的操作从而使得条件满足。等到其他线程完成操作释放后再分配线程。当前线程获得资源继续执行操作。

6、互斥锁

****互斥锁 Lock():在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

互斥锁三步骤 ~~~ 创建一把锁==》上锁==》释放锁 三步走

#  TODO   互斥锁  Lock()
import threading
# # TODO 创建一把锁==》上锁==》释放锁   三步走
# mutext=threading.Lock()
# mutext.acquire()
# mutext.release()
#定义全局变量
g_num=0
# 创建一把锁
mutext=threading.Lock()
# 每次全局变量加一
def sun_num():
    # TODO   上锁
    mutext.acquire()
    for i in range(1000000):
        global g_num
        g_num+=1
    print("sun_num",g_num)
    # TODO  释放锁
    mutext.release()
# 每次全局变量加一
def sun_num2():
    # TODO 上锁
    mutext.acquire()
    for i in range(1000000):
        global g_num
        g_num+=1
    print("sun_num2", g_num)
if __name__ == '__main__':
    sun_numThred=threading.Thread(target=sun_num)
    sun_num2Thred=threading.Thread(target=sun_num2)
    #开启线程
    sun_numThred.start()
    sun_num2Thred.start()

结果:image.png是不是非常神奇。主义事项:一、互斥锁就三步骤 1、创建一把锁 2、上锁 3、释放锁 。二、保证共享数据操作的完整性三、等当前上锁线程执行完成,释放锁后其他线程才能申请资源

7、死锁

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去

# TODO  死锁
import threading
import time
# 创建互斥锁
lock=threading.Lock()
def get_value(index):
    #上锁
    lock.acquire()
    print(threading.current_thread())
    my_list=[3,4,7,2]
    # 根据下标释放取值
    if index>=len(my_list):
        print("下标越界:",index)
        # TODO  当下标越界了释放锁,让后面线程继续取值
        # lock.release()
        return
    value=my_list[index]
    print(value)
    time.sleep(0.2)
    #释放锁
    # lock.release()
if __name__ == '__main__':
    #模拟大量线程取值
    for i in range(30):
        sub_thred=threading.Thread(target=get_value,args=(i,))
        sub_thred.start()

结果:image.png注释掉释放锁的操作,线程刚执行就卡住了,产生了死锁。

打开释放所操作

# TODO  死锁
import threading
import time
# 创建互斥锁
lock=threading.Lock()
def get_value(index):
    #上锁
    lock.acquire()
    print(threading.current_thread())
    my_list=[3,4,7,2]
    # 根据下标释放取值
    if index>=len(my_list):
        print("下标越界:",index)
        # TODO  当下标越界了释放锁,让后面线程继续取值
        lock.release()
        return
    value=my_list[index]
    print(value)
    time.sleep(0.2)
    #释放锁
    lock.release()
if __name__ == '__main__':
    #模拟大量线程取值
    for i in range(30):
        sub_thred=threading.Thread(target=get_value,args=(i,))
        sub_thred.start()

结果:image.png1、因为我们是用方式传参,循环30次,索引0~29。

2、我们会发现我们在判断越界后,因为释放锁所以仍会输出。

3、加入互斥锁解除了死锁危机。

不良使
目录
相关文章
我爱matlab
|
7天前
|
机器学习/深度学习 算法 异构计算
m基于FPGA的多通道FIR滤波器verilog实现,包含testbench测试文件
本文介绍了使用VIVADO 2019.2仿真的多通道FIR滤波器设计。展示了系统RTL结构图,并简述了FIR滤波器的基本理论,包括单通道和多通道的概念、常见结构及设计方法,如窗函数法、频率采样法、优化算法和机器学习方法。此外,还提供了Verilog核心程序代码,用于实现4通道滤波器模块,包含时钟、复位信号及输入输出接口的定义。
我爱matlab
23 7
长梦
|
7天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
长梦
23 1
长梦
|
6天前
|
前端开发 测试技术 C++
Python自动化测试面试:unittest、pytest与Selenium详解
【4月更文挑战第19天】本文聚焦Python自动化测试面试,重点讨论unittest、pytest和Selenium三大框架。unittest涉及断言、TestSuite和覆盖率报告;易错点包括测试代码冗余和异常处理。pytest涵盖fixtures、参数化测试和插件系统,要注意避免过度依赖unittest特性。Selenium的核心是WebDriver操作、等待策略和测试报告生成,强调智能等待和元素定位策略。掌握这些关键点将有助于提升面试表现。
长梦
20 0
长梦
|
6天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
长梦
13 0
长梦
|
7天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
长梦
14 1
Flask框架在Python面试中的应用与实战
长梦
|
8天前
|
数据可视化 Python
Python模型评估与选择:面试必备知识点
【4月更文挑战第17天】本文深入探讨了Python模型评估与选择在面试中的关键点,包括性能度量、过拟合与欠拟合识别、模型比较与选择、模型融合和偏差-方差权衡。强调了避免混淆评估指标、忽视模型验证和盲目追求高复杂度模型的常见错误,并提供相关代码示例,如交叉验证、网格搜索和超参数调优。通过理解这些概念和技巧,可在面试中展示出色的数据科学能力。
长梦
31 12
长梦
|
8天前
|
机器学习/深度学习 搜索推荐 Python
Python特征工程面试:从理论到实践
【4月更文挑战第17天】本文探讨了Python在数据科学面试中的特征工程,涵盖基础概念如特征选择和提取,实战技能如缺失值和异常值处理,以及特定场景应用。强调避免过度依赖单一方法,忽视数据分布和相关性,以及保持特征工程的可解释性。提供代码示例展示了处理缺失值、标准化、特征选择和异常值检测的基本操作。建议结合业务理解,灵活运用多种方法并注重模型解释性。
长梦
23 9
长梦
|
8天前
|
数据采集 机器学习/深度学习 数据挖掘
Python数据清洗与预处理面试题解析
【4月更文挑战第17天】本文介绍了Python数据清洗与预处理在面试中的常见问题,包括Pandas基础操作、异常值处理和特征工程。通过示例代码展示了数据读取、筛选、合并、分组统计、离群点检测、缺失值和重复值处理、特征缩放、编码、转换和降维。强调了易错点,如忽视数据质量检查、盲目处理数据、数据隐私保护、过度简化特征关系和忽视模型输入要求。掌握这些技能和策略将有助于在面试中脱颖而出。
长梦
24 8
长梦
|
9天前
|
缓存 自然语言处理 数据处理
Python自然语言处理面试:NLTK、SpaCy与Hugging Face库详解
【4月更文挑战第16天】本文介绍了Python NLP面试中NLTK、SpaCy和Hugging Face库的常见问题和易错点。通过示例代码展示了如何进行分词、词性标注、命名实体识别、相似度计算、依存关系分析、文本分类及预训练模型调用等任务。重点强调了理解库功能、预处理、模型选择、性能优化和模型解释性的重要性,帮助面试者提升NLP技术展示。
长梦
29 5
长梦
|
9天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
长梦
133 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答

热门文章

最新文章

  • 1
    面试官:Redis如何实现延迟任务?
  • 2
    关于技术面试问题
  • 3
    Flink常见面试问题(附答案)
  • 4
    答案很详细的MyBatis面试题(含示例代码)
  • 5
    Linux命令Top 100驱动人生! 面试必备
  • 6
    Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
  • 7
    面试官:请谈一谈你对OOP的理解?
  • 8
    面试官问10W 行级别数据的 Excel 导入如何10秒处理
  • 9
    系统设计面试的行家指南(上)(1)
  • 10
    前端最常见的JS面试题大全
  • 1
    Java 测试和调试:提高代码质量的实用策略
    9
  • 2
    【专栏】测试驱动开发(TDD)与行为驱动开发(BDD)的比较与选择
    10
  • 3
    深入理解软件自动化测试中的数据驱动策略
    8
  • 4
    【测试】优化软件测试:有效测试用例设计的关键
    9
  • 5
    深入探索软件测试中的持续集成与自动化测试实践
    10
  • 6
    深入理解自动化测试框架Selenium的设计与实践
    6
  • 7
    python集成测试持续集成
    11
  • 8
    python集成测试执行测试
    12
  • 9
    深入理解自动化测试中的数据驱动策略
    6
  • 10
    Appium控件交互策略:优化自动化测试效率的关键方法
    11
  • 相关课程

    更多
  • Python语言基础 - 列表、元组、字典、集合
  • Python网络编程
  • Python爬虫实战
  • Java面试疑难点解析 - 面试技巧及语言基础
  • Java面试疑难点解析 - Java Web开发
  • Java面试疑难点解析 - 系统架构及项目设计
  • 相关电子书

    更多
  • 移动互联网测试到质量的转变
  • 给ITer的技术实战进阶课-阿里CIO学院独家教材(四)
  • F2etest — 多浏览器兼容性测试整体解决方案
  • 相关实验场景

    更多
  • 测试场景(RDS无优惠)
  • 用Python画圣诞树
  • 使用Python完成RDS数据开发及分析
  • 极致弹性的PolarDB Serverless确保数据业务持续在线
  • Python选择及循环结构
  • 云端Python及基本操作
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    聚圣源手游游戏起名大全免费的起名大全软件下载西米露怎么煮又快又好我有一个想法作文通讯行业的注册公司起名自相矛盾的故事玄女经马场起名称古天战帝秋色天空anonib起名常用汉字笔画2019出生的孩子起名姓明如何起名古代商铺字号起名大全湖南电信网上营业厅地狱火半岛的工事严寒地区www.shuaijiao.com姓姬男孩起名五月播播杨姓 孩子取名起名大全郝姓起名狗年男孩起名字石景泰蓝主要原料是什么龙宝宝起什么名字大全曹起名男童男篮世界排名中秋节空间留言代码姓氏程起名女孩子淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

    聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化