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搭建HTTP服务器和FTP服务器
Mar 09 Python
利用Python实现Windows定时关机功能
Mar 21 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
python字典DICT类型合并详解
Aug 17 Python
python 文件转成16进制数组的实例
Jul 09 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
python操作gitlab API过程解析
Dec 27 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
Django中FilePathField字段的用法
May 21 Python
Django中session进行权限管理的使用
Jul 09 Python
python playwright之元素定位示例详解
Jul 23 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使用curl下载指定大小的文件实例代码
2017/09/30 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
javascript 写类方式之一
2009/07/05 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
js鼠标悬浮出现遮罩层的方法
2015/01/28 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
2018/02/06 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
基于Vue全局组件与局部组件的区别说明
2020/08/11 Javascript
Python的subprocess模块总结
2014/11/07 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
Python实现图片添加文字
2019/11/26 Python
Python3 解决读取中文文件txt编码的问题
2019/12/20 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
python opencv实现简易画图板
2020/08/27 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
毕业生自我推荐
2013/11/04 职场文书
公司领导班子对照材料
2014/08/18 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
财务会计实训报告
2014/11/05 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android