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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
Python实现的检测网站挂马程序
Nov 30 Python
Python中的面向对象编程详解(上)
Apr 13 Python
Python中的匿名函数使用简介
Apr 27 Python
python实现图片批量压缩程序
Jul 23 Python
django 实现电子支付功能的示例代码
Jul 25 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
Jun 27 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
Python3+Django get/post请求实现教程详解
Feb 16 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
很实用的一个完整email发送程序
2006/10/09 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
jquery简单实现幻灯片的方法
2015/08/03 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
数控专业大学生的自我鉴定
2013/11/13 职场文书
护士自荐信范文
2013/12/15 职场文书
元旦活动感言
2014/03/08 职场文书
寄语是什么意思
2014/04/10 职场文书
10的分与合教学反思
2014/04/30 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
幼师求职自荐信
2015/03/26 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
详细介绍python类及类的用法
2021/05/31 Python
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server
python playwright之元素定位示例详解
2022/07/23 Python
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis