Python实战笔记(三) 多线程 上

简介: Python实战笔记(三) 多线程

前言


Python 提供 threading 模块用于控制线程处理,使我们可以更加方便地完成多线程任务


目录


1、线程模块的常用属性和方法

2、创建线程对象

3、线程对象的常用属性和方法

4、维护线程安全


正文


1、线程模块的常用属性和方法


active_count():返回当前存活的线程对象的数量


enumerate()      :返回当前存活的线程对象的列表


current_thread():返回当前线程对象


main_thread()      :返回主线程对象


get_ident():返回当前线程的线程标识符


stack_size([size]):返回创建线程时使用的堆栈大小


TIMEOUT_MAX:指定阻塞函数(如 acquire、wait、wait_for 等)timeout 参数的最大值

import threading
thread_number = threading.active_count()
print(thread_number) # 1
curr_thread = threading.main_thread()
main_thread = threading.current_thread()
print(curr_thread == main_thread) # True


2、创建线程对象


threading.Thread(group, target, name, args, kwargs, *, daemon)


  • group  :为拓展 ThreadGroup 而保留,无需设置,默认为 None
  • target:调用对象,默认为 None,表示不需要调用任何方法
  • name    :线程名称,默认以 Thread-N 的格式命名
  • args    :传递给调用对象的参数 (位置参数) ,默认为 ()
  • kwargs:传递给调用对象的参数 (关键字参数),默认为 {}
  • daemon:是否设置为守护线程,默认为 None,表示继承调用者的属性


非守护进程和守护进程的区别:


  • 当程序退出时,如果还有非守护线程在运行,程序会等待所有非守护线程结束后才会真正退出
  • 当程序退出时,如果还有守护线程运行,程序将会强制结束所有守护线程,导致资源不能正确释放


3、线程对象的常用属性和方法


  • name:线程名称
  • ident:线程标识符
  • daemon:是否为守护线程
  • is_alive():线程还是否存活
  • import threading


main_thread = threading.current_thread()
print(main_thread.name) # MainThread
print(main_thread.ident) # 1084
print(main_thread.daemon) # False
print(main_thread.is_alive()) # True
  • start():创建一个新的线程并由新的线程调用方法,不同线程同时执行
import threading
import time
def sleep(wait):
    name = threading.current_thread().name
    print(name, 'Start')
    time.sleep(wait)
    print(name, 'Terminated')
def main():
    name = threading.current_thread().name
    print(name, 'Start')
    worker = threading.Thread(target = sleep, args = (2,))
    worker.start() # 启动工作线程 Thread-1
    print(name, 'Terminated')
if __name__ == '__main__':
    main() # 启动主线程 MainThread
# 执行结果
# MainThread Start
# Thread-1 Start
# MainThread Terminated
# 沉睡 2 秒
# Thread-1 Terminated


  • join():阻塞调用者线程,直至被调用线程结束
import threading
import time
def sleep(wait):
    name = threading.current_thread().name
    print(name, 'Start')
    time.sleep(wait)
    print(name, 'Terminated')
def main():
    name = threading.current_thread().name
    print(name, 'Start')
    worker = threading.Thread(target = sleep, args = (2,))
    worker.start()
    worker.join() # 阻塞线程 MainThread,直至线程 Thread-1 结束
    print(name, 'Terminated')
if __name__ == '__main__':
    main()
# 执行结果
# MainThread Start
# Thread-1 Start
# 沉睡 2 秒
# Thread-1 Terminated
# MainThread Terminated
  • run():不会创建线程,相当于直接调用方法
import threading
import time
def sleep(wait):
    name = threading.current_thread().name
    print(name, 'Start')
    time.sleep(wait)
    print(name, 'Terminated')
def main():
    name = threading.current_thread().name
    print(name, 'Start')
    worker = threading.Thread(target = sleep, args = (2,))
    worker.run() # 相当于直接由主线程 MainThread 调用方法 sleep
    print(name, 'Terminated')
if __name__ == '__main__':
    main()
# 执行结果
# MainThread Start
# MainThread Start
# 沉睡 2 秒
# MainThread Terminated
# MainThread Terminated
  • setDaemon():是否设置为守护线程
import threading
import time
def sleep(wait):
    name = threading.current_thread().name
    print(name, 'Start')
    time.sleep(wait)
    print(name, 'Terminated')
def main():
    name = threading.current_thread().name
    print(name, 'Start')
    worker = threading.Thread(target = sleep, args = (2,))
    worker.setDaemon(True) # 设置工作线程 Thread-1 为守护进程
    worker.start()
    print(name, 'Terminated') # 当程序结束后,会强制终止守护线程
if __name__ == '__main__':
    main()
# 执行结果
# MainThread Start
# Thread-1 Start
# MainThread Terminated
目录
相关文章
|
24天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
220 7
|
28天前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
1月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
275 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
1月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
94 12
|
1月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
234 1
|
1月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
142 1
|
1月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
388 1
|
25天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
196 0
|
1月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
315 0
|
1月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
139 6

推荐镜像

更多