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计算最大优先级队列实例
Dec 18 Python
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
RC4文件加密的python实现方法
Jun 30 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
python实现爬山算法的思路详解
Apr 09 Python
python3的print()函数的用法图文讲解
Jul 16 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
python多进程并发demo实例解析
Dec 13 Python
Python pandas库中的isnull()详解
Dec 26 Python
通过 Python 和 OpenCV 实现目标数量监控
Jan 05 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
我的论坛源代码(六)
2006/10/09 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
JavaScript实现tab栏切换效果
2020/03/16 Javascript
详解vue v-model
2020/08/31 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
[00:11]战神迅矛
2019/03/06 DOTA
新手常见6种的python报错及解决方法
2018/03/09 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
Python urllib.request对象案例解析
2020/05/11 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
初一新生军训方案
2014/05/22 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
职称评定个人总结
2015/03/05 职场文书
2015年护士节慰问信
2015/03/23 职场文书
教师工作证明范本
2015/06/12 职场文书
运动会宣传语
2015/07/13 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电