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
目录
相关文章
|
4天前
|
存储 数据采集 数据库
Python爬虫实战:股票分时数据抓取与存储
Python爬虫实战:股票分时数据抓取与存储
|
5天前
|
Python
python3多线程中使用线程睡眠
本文详细介绍了Python3多线程编程中使用线程睡眠的基本方法和应用场景。通过 `time.sleep()`函数,可以使线程暂停执行一段指定的时间,从而控制线程的执行节奏。通过实际示例演示了如何在多线程中使用线程睡眠来实现计数器和下载器功能。希望本文能帮助您更好地理解和应用Python多线程编程,提高程序的并发能力和执行效率。
34 20
|
18天前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
97 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
28天前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
56 20
|
1月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
106 61
Python装饰器实战:打造高效性能计时工具
|
2月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
2月前
|
并行计算 算法 安全
面试必问的多线程优化技巧与实战
多线程编程是现代软件开发中不可或缺的一部分,特别是在处理高并发场景和优化程序性能时。作为Java开发者,掌握多线程优化技巧不仅能够提升程序的执行效率,还能在面试中脱颖而出。本文将从多线程基础、线程与进程的区别、多线程的优势出发,深入探讨如何避免死锁与竞态条件、线程间的通信机制、线程池的使用优势、线程优化算法与数据结构的选择,以及硬件加速技术。通过多个Java示例,我们将揭示这些技术的底层原理与实现方法。
122 3
|
2月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
65 10
|
3月前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。

推荐镜像

更多