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中操作字符串之rstrip()方法的使用
May 19 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
基于python计算并显示日间、星期客流高峰
May 07 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php查看session内容的函数
2008/08/27 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
Javascript获取某个月的天数
2018/05/30 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
python爬取51job中hr的邮箱
2016/05/14 Python
python:接口间数据传递与调用方法
2018/12/17 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
自学python用什么系统好
2020/06/23 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
生物制药毕业生自荐信
2013/10/16 职场文书
医学生自荐信范文
2013/12/03 职场文书
药剂专业学生求职信范文
2013/12/28 职场文书
校本教研工作制度
2014/01/22 职场文书
会计学专业自荐信
2014/06/25 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
教师创先争优承诺书
2015/04/27 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
总结Python常用的魔法方法
2021/05/25 Python
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL