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实现统计代码行数的方法
May 22 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Python多线程编程之多线程加锁操作示例
Sep 06 Python
python读取目录下最新的文件夹方法
Dec 24 Python
PyQt5实现简易计算器
May 30 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
详解python中index()、find()方法
Aug 29 Python
python日期与时间戳的各种转换示例
Feb 12 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Pytorch mask_select 函数的用法详解
Feb 18 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 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中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
vue多次循环操作示例
2019/02/08 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
python爬虫工具例举说明
2020/11/30 Python
python 如何引入协程和原理分析
2020/11/30 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
治安消防安全责任书
2014/07/23 职场文书
计算机教师工作总结
2015/08/13 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
如何做好员工培训计划?
2019/07/09 职场文书
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python