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 相关文章推荐
python判断字符串是否包含子字符串的方法
Mar 24 Python
python实现定时播放mp3
Mar 29 Python
Python随机生成数模块random使用实例
Apr 13 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
PyCharm设置每行最大长度限制的方法
Jan 16 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
简单的Python调度器Schedule详解
Aug 30 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
详解Go语言运用广度优先搜索走迷宫
Jun 23 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
php MySQL与分页效率
2008/06/04 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
JS 常用校验函数
2009/03/26 Javascript
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
js实现音乐播放控制条
2017/09/09 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
对python中数组的del,remove,pop区别详解
2018/11/07 Python
python列表list保留顺序去重的实例
2018/12/14 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
传播学专业毕业生自荐信
2013/11/04 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
投标担保书范文
2014/04/02 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python