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实现递归遍历文件夹并删除文件
Apr 18 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
python绘制规则网络图形实例
Dec 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
Python selenium爬取微信公众号文章代码详解
Aug 12 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 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 xfocus防注入资料
2008/04/27 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
Python如何实现文本转语音
2016/08/08 Python
Python3 socket同步通信简单示例
2017/06/07 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
django中的数据库迁移的实现
2020/03/16 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
英国精品买手店:Browns Fashion
2016/09/29 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
优秀交警事迹材料
2014/01/26 职场文书
药店促销活动策划方案
2014/08/24 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
React forwardRef的使用方法及注意点
2021/06/13 Javascript
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle