当前位置: 首页 > news >正文

Python:多线程意义及应用场景

多线程并不是多个线程并发在同一个时间点运行,而是CPU有计划的交替执行多个线程

计算为主的程序  CPU密集型程序

磁盘或网络为主的程序  IO密集型

定义一个线程类:
1.继承Thread

2.重构run方法

from threading import Thread
import time

class Ourthread(Thread):#定义一个新子类来继承Thread
    #重构run方法,规定run这个名字,表示线程活动的方法
    def run(self):
        print('duixiang')
        time.sleep(2)
        print('???')
if __name__=='__main__':
    #创建线程
    i1=Ourthread()
    i1.start()#启动线程,start会调用run方法

#拓展:start  run方法的区别:
start方法是声明分到一个子线程的函数已经就绪,等待被CPU执行

run方法是执行到这个子线程时,自动调用的方法

from threading import Thread
import time,threading

class Ourthread(Thread):#定义一个新子类来继承Thread
    #重构run方法,规定run这个名字,表示线程活动的方法
    def run(self):
        print(f'当前线程:{threading.current_thread().name}')
if __name__=='__main__':
    #创建线程实例
    t1=Ourthread()
    t2 = Ourthread()

    #启动线程
    t1.start()
    t2.start()

    #run方法启动
    t1.run()
    t2.run()

运行结果为:

当前线程:Thread-1
当前线程:Thread-2
当前线程:MainThread
当前线程:MainThread

线程之间执行是无序的,它是由CPU调度来决定的,CPU调度哪个线程哪个就先执行

import time,threading

def task():
    time.sleep(1)
    print(f'当前线程:{threading.current_thread().name}\n',end='')

if __name__=='__main__':
    for i in range(5):
        #创建线程
        t=threading.Thread(target=task)
        t.start()

输出结果是无序的,在这里展示其中一种:
当前线程:Thread-1 (task)
当前线程:Thread-2 (task)
当前线程:Thread-3 (task)
当前线程:Thread-4 (task)
当前线程:Thread-5 (task)

资源共享:

from threading import Thread
import time

li=[]#全局变量
#写数据
def writedata():
    for i in range(5):
        li.append(i)
        time.sleep(0.2)
    print('writedata:',li)

#读数据
def readdata():
    print('readdata:',li)

if __name__=='__main__':
    #创建写入数据的线程:
    wd=Thread(target=writedata)
    #创建读取数据的线程:
    rd=Thread(target=readdata)

    #启动线程
    wd.start()
    wd.join()#阻塞主线程
    rd.start()

    print('hahahah')

资源竞争:

from threading import Thread
a=0
b=1000000

def sum1():
    for i in range(b):
        global a #a为整型,修改值时引用地址会改变,需声明
        a+=1
    print(f'第一次:{a}\n',end='')

def sum2():
    for i in range(b):
        global a #a为整型,修改值时引用地址会改变,需声明
        a+=1
    print(f'第二次:{a}\n',end='')

if __name__ == "__main__":
    # 创建线程
    thread = Thread(target=sum1)
    thread1 = Thread(target=sum2)
    # 启动线程
    thread.start()
    thread1.start()
    # 等待线程结束
    thread.join()
    thread1.join()

相关文章:

  • 【Git江湖秘典——禁制、心法与渡劫篇】
  • 重要重要!!fisher矩阵是怎么计算和更新的,以及计算过程中参数的物理含义
  • java 解析二维码工具类
  • 数据结构--红黑树
  • 第四章 表单(2)- 输入组件
  • Python 变量作用域、global 关键字与闭包作用域深度解析 第三部分
  • vue中keep-alive组件的使用
  • Web前端考核 JavaScript知识点详解
  • 《可爱风格 2048 游戏项目:HTML 实现全解析》
  • 本地部署Stable Diffusion生成爆火的AI图片
  • [深度学习]图片分类任务
  • 新版本Springboot的lombok导入依赖出现问题的解决办法
  • C++友元:跨墙访问的三种姿势
  • MySQL小练习
  • 高速电路中的时序设计
  • 哪吒汽车:一边熬夜蹦迪,一边找药投医
  • easyExcel2.2.10中为0数据显示为空
  • 基于深度学习的行人人脸识别系统的设计与实现
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的日志管理:Logback 的集成
  • LeetCode-215. 数组中的第K个最大元素
  • 吴清:全力支持中央汇金公司发挥好类“平准基金”作用
  • 胡塞武装称以色列所有机场均为其打击目标
  • 南京明孝陵石兽遭涂鸦“到此一游”,景区:已恢复原貌,警方在排查
  • 海港通报颜骏凌伤停两至三周,国足面临门将伤病危机
  • 在“蟑螂屋”里叠衣服,我看见人生百态
  • 福州交警:一小型汽车因操作不当撞上汽车和电动车,致2人死亡