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 相关文章推荐
编写自定义的Django模板加载器的简单示例
Jul 21 Python
Python实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
python调用fortran模块
Apr 08 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
python文件名和文件路径操作实例
Sep 29 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
python调用staf自动化框架的方法
Dec 26 Python
对Django中的权限和分组管理实例讲解
Aug 16 Python
下载官网python并安装的步骤详解
Oct 12 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 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获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
Javascript 继承机制的实现
2009/08/12 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
python不换行之end=与逗号的意思及用途
2017/11/21 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python 实现简单的FTP程序
2019/12/27 Python
东方电视购物:东方CJ
2016/10/12 全球购物
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
写给女朋友的道歉信
2014/01/12 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
售后服务承诺书
2014/03/26 职场文书
老龙头导游词
2015/02/11 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript
如何有效防止sql注入的方法
2021/05/25 SQL Server
Python中的 enumerate和zip详情
2022/05/30 Python