Python多线程实用方法以及共享变量资源竞争问题


Posted in Python onApril 12, 2022

一,实用方法

  • 1.线程之间执行是无序的,cpu调度哪个线程就执行哪个线程;
  • 2.主线程等待所有子线程结束后再结束,设置守护线程可以实现当主线程结束时子线程立马结束;
  • 3.设置守护线程:1.threading.Thread(daemon=True),2.线程对象.setDaemon(True);
  • 4.线程之间共享全局变量,存在资源竞争问题。
'''
线程之间执行是无序的,cpu调度哪个线程就执行哪个线程
主线程会等待所有子线程结束之后再结束,设置守护线程可以实现当主线程结束时子线程立马结束
设置守护线程:1.threading.Thread(daemon=True),2.线程对象.setDaemon(True)
线程之间共享全局变量,存在资源竞争问题
'''
 
 
# 导入模块(模块名.py,包名init.py)
import threading
import time
 
 
def task1(count):
    # 获取当前线程对象
    # t=threading.current_thread()
    # print('Task1_name:',t.name)
    print()
    for i in range(count):
        print('Task A ',i+1)
        time.sleep(0.5)
 
def task2(content,count):
    print('Task2_name:', threading.current_thread().name)
    for i in range(count):
        print(f'{content}__Task B ',i+1)
        time.sleep(0.5)
 
 
if __name__ == '__main__':
 
    t1=threading.Thread(target=task1,name='T1',daemon=True,args=(5,))
    t2=threading.Thread(target=task2,name='T2',kwargs={'content':'Yes','count':5})
    # 设置守护主线程的第二种方式
    # t1.setDaemon(True)
    t2.setDaemon(True)
    t1.start()
    t1.join()   # 阻塞函数,t1执行完毕才会向下执行
    t2.start()
    # t2.join()
    print('Main thread over')

二、补充:Python多线程共享变量资源竞争问题

  • 1.资源竞争问题:sum+=1执行时大致会分为三步(取值、加1、写回),可能刚执行2步cpu就去切换到了另一个线程去执行;
  • 2.解决办法:1.使用join()方法来设置线程同步(效率不高),2.加锁(可以保证同一时刻只有一个线程在执行) 。
'''
资源竞争问题:sum+=1执行时大致会分为三步(取值、加1、写回),可能刚执行2步cpu就去切换到了另一个线程去执行
解决办法:1.使用join()方法来设置线程同步(效率不高),2.加锁(可以保证同一时刻只有一个线程在执行)
'''
 
import threading
import time
 
 
sum=0
lock=threading.Lock()
 
def add_num1():
    global sum
    for i in range(1000000):
        # lock.acquire()    # 加锁
        sum+=1
        # lock.release()    # 解锁
    print(f'{threading.current_thread().name}的计算结果是{sum}')
 
 
def add_num2():
    global sum
    for i in range(1000000):
        # lock.acquire()
        sum+=1
        # lock.release()
    print(f'{threading.current_thread().name}的计算结果是{sum}')
 
if __name__ == '__main__':
    t1=threading.Thread(target=add_num1)
    t2=threading.Thread(target=add_num2)
    t1.start()
    # 设置阻塞函数,设置线程同步
    t1.join()
    t2.start()
    print(f'Main的sum值是{sum}')

到此这篇关于Python多线程的使用详情的文章就介绍到这了!

Python 相关文章推荐
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
Python探索之ModelForm代码详解
Oct 26 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
python一键去抖音视频水印工具
Sep 14 Python
python 同时运行多个程序的实例
Jan 07 Python
Python3数字求和的实例
Feb 19 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
python输出决策树图形的例子
Aug 09 Python
Python中Subprocess的不同函数解析
Dec 10 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
Python使用socket去实现TCP客户端和TCP服务端
Apr 12 #Python
Python闭包的定义和使用方法
Apr 11 #Python
什么是Python装饰器?如何定义和使用?
Apr 11 #Python
Python经常使用的一些内置函数
python处理json数据文件
Python几种酷炫的进度条的方式
Python通过loop.run_in_executor执行同步代码 同步变为异步
You might like
日本十大惊悚动漫
2020/03/04 日漫
PHP编程函数安全篇
2013/01/08 PHP
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
浅析Django中关于session的使用
2019/12/30 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
python3实现简单飞机大战
2020/11/29 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
销售人员个人求职信
2013/09/26 职场文书
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
《影子》教学反思
2014/02/21 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL
redis lua限流算法实现示例
2022/07/15 Redis