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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
Django自定义认证方式用法示例
Jun 23 Python
numpy自动生成数组详解
Dec 15 Python
对Python 数组的切片操作详解
Jul 02 Python
python如何发布自已pip项目的方法步骤
Oct 09 Python
Python中@property的理解和使用示例
Jun 11 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
在Tensorflow中查看权重的实现
Jan 24 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
python源码剖析之PyObject详解
May 18 Python
python函数的两种嵌套方法使用
Apr 02 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
js选项卡的实现方法
2015/02/09 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
详解Angular中$cacheFactory缓存的使用
2016/08/19 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
python多线程用法实例详解
2015/01/15 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python提取频域特征知识点浅析
2019/03/04 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
python常量折叠基础知识点讲解
2021/02/28 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
毕业学生推荐信
2013/12/01 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
幽灵公主观后感
2015/06/09 职场文书
2016教师国培研修感言
2015/12/08 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
angular4实现带搜索的下拉框
2022/03/25 Javascript