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 13 Python
简单谈谈python的反射机制
Jun 28 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Python笔试面试题小结
Sep 07 Python
用python写测试数据文件过程解析
Sep 25 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 Python
Pyspark获取并处理RDD数据代码实例
Mar 27 Python
Python 实现自动完成A4标签排版打印功能
Apr 09 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
python如何为list实现find方法
May 30 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
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
Python with的用法
2014/08/22 Python
python通过getopt模块如何获取执行的命令参数详解
2017/12/29 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
python安装gdal的两种方法
2019/10/29 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
讲文明懂礼貌演讲稿
2014/09/11 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
分享3个非常实用的 Python 模块
2022/03/03 Python