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获得图片base64编码示例
Jan 16 Python
Python EOL while scanning string literal问题解决方法
Sep 18 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
Django自带的加密算法及加密模块详解
Dec 03 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
在python3.9下如何安装scrapy的方法
Feb 03 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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事务处理的方法
2014/12/25 PHP
Laravel 5 学习笔记
2015/03/06 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
vue组件实例解析
2017/01/10 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
python测试驱动开发实例
2014/10/08 Python
详解Python的Django框架中的模版继承
2015/07/16 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
Django CBV类的用法详解
2019/07/26 Python
python speech模块的使用方法
2020/09/09 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
网上签名寄语活动留言
2014/01/18 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
刘胡兰观后感
2015/06/16 职场文书
医院病假条怎么写
2015/08/17 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
springboot读取resources下文件的方式详解
2022/06/21 Java/Android