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

Python基础之threading多线程同时运行程序

threading多线程同时运行程序

目录

  • threading多线程同时运行程序
    • 1 threading
      • 1.1 概念
      • 1.2 主要组件
      • 1.3 注意事项
      • 1.4 基本语法
    • 2 代码测试
      • 2.1 分别开启线程
      • 2.2 线程连续启动

1 threading


1.1 概念

Python 的 threading 库用于实现多线程编程,允许程序在同一时间执行多个任务。threading 库提供了丰富的多线程编程工具,适合处理 I/O 密集型任务或需要并发执行的场景对于 CPU 密集型任务,多线程可能不会提升性能,建议使用 multiprocessing 模块,以避免 GIL(全局解释器锁)的限制。

1.2 主要组件

  • Thread 类:用于创建和管理线程。通过继承 Thread 类或直接实例化并传入目标函数来创建线程。
  • Lock 类:提供线程同步机制,防止多个线程同时访问共享资源。
  • RLock 类:可重入锁,允许同一线程多次获取锁。
  • Condition 类:用于线程间的条件同步,允许线程等待特定条件满足。
  • Semaphore 类:限制同时访问共享资源的线程数量。
  • Event 类:用于线程间的事件通知,一个线程可以等待事件,另一个线程可以触发事件。
  • Timer 类:用于在指定时间后执行函数。
  • Barrier 类:用于同步多个线程,确保它们在某个点同时继续执行。

1.3 注意事项

  • GIL(全局解释器锁): Python 的 GIL 限制了同一时间只有一个线程执行 Python 字节码,因此在 CPU 密集型任务中,多线程可能不会提升性能
  • 线程安全: 多线程编程需注意线程安全问题,避免竞争条件。
  • 调试: 多线程程序调试较为复杂,需使用适当的工具和方法。

1.4 基本语法

  • thread = threading.Thread(target=worker,args=(‘work1’,))创建线程
    • target=worker,指定线程worker,worker为def的函数名
    • args=(‘work1’,),worker函数所用到的参数,无可不写
  • thread .start()启动线程
  • thread .join()等待线程完成

2 代码测试


2.1 分别开启线程

每次线程的开启,线程和主线顺序可能都不同

代码展示:

import threading
def worker():
    print('开始')
    for i in range(5):
        print(f'正在worker:{i}')
    print('完成')
thread = threading.Thread(target=worker)
thread.start()
print('开始主线')

def worker1(n):
    print(f'{n}开始')
    for i in range(5):
        print(f'{n}正在{i}')
    print('完成')

thread1 = threading.Thread(target=worker1,args=('work1',))
thread1.start()
print('继续主线')

运行结果:
在这里插入图片描述

在这里插入图片描述

2.2 线程连续启动

可以明显看到时间的停顿,顺序不同。

代码展示:

import threading
import time
def run(n):
    print('task',n)
    time.sleep(1)
    print('2s')
    time.sleep(1)
    print('1s')
    time.sleep(1)
    print('0s')
    time.sleep(1)

def run2(t):
    time.sleep(t)
    print(f'wait {t}s')

if __name__ =='__main__':
    t1 = threading.Thread(target=run,args=('t1',))
    t2 = threading.Thread(target=run, args=('t1',))
    t1.start()
    t2.start()

    t3 = threading.Thread(target=run2, args=(5,))
    t4 = threading.Thread(target=run2, args=(8,))
    t3.start()
    time.sleep(10)
    print('开始计时')
    t4.start()

运行结果:
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/581152.html

相关文章:

  • 衣联网的商品列表页面结构是怎样的?
  • 前端项目中创建自动化部署脚本,用于 Jenkins 触发 npm run publish 来完成远程部署
  • 外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试
  • 爱普生可编程晶振SG-8200CJ特性与应用
  • Sentinel熔断降级
  • Seata简要说明
  • 《C#上位机开发从门外到门内》2-2:I2C总线协议及其应用详解
  • lua如何写出高性能的kong网关插件
  • ctf-web: php原生类利用 -- GHCTF Popppppp
  • 说一下spring的事务隔离级别?
  • 数据结构全解析:从线性到非线性,优缺点与应用场景深度剖析
  • bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)
  • Git的必要配置
  • 基于MCAL的S32K3 GPIO外部中断使用
  • 怎么实现: 大语言模型微调案例
  • 从零开始实现大语言模型(十三):预训练大语言模型GPTModel
  • Netty基础—2.网络编程基础四
  • MoonSharp 文档三
  • Session、Cookie、Token的区别
  • 【每日学点HarmonyOS Next知识】状态变量、动画UI残留、Tab控件显示、ob前缀问题、文字背景拉伸