热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python多线程编程:阻塞操作与守护线程的应用

本文通过生动的例子讲解了Python中多线程的阻塞操作(join)和守护线程(setDaemon)的使用方法。通过模拟一个聚会场景,详细解析了不同线程控制方式下的程序行为。

引言

假设Yoyo邀请朋友小明和小王参加一次火锅聚餐,在用餐结束后可能出现如下几种情况:



  • 情况一:Yoyo先吃完离开,而小明和小王还在用餐。这会导致提前离席者未能参与结账,留下未完成的账单。


  • 情况二:Yoyo虽然先完成用餐,但等到小明和小王也吃完后再一同结账离开。


  • 情况三:Yoyo耐心等待直到所有朋友都享用完美食,随后大家一起结账离去。



主线程与子线程的关系

上述场景可以映射到Python的多线程编程中,其中Yoyo代表主线程,而小明和小王则代表子线程。


示例代码


以下代码展示了如何创建子线程以及它们与主线程之间的基本交互:


# coding=utf-8
import threading
import time

def enjoyHotpot(person):
print(f'{time.ctime()} {person}正在享用羊肉')
time.sleep(1)
print(f'{time.ctime()} {person}正在品尝鱼丸')


class DinerThread(threading.Thread):
def __init__(self, person, name):
super().__init__()
self.person = person
self.name = name

def run(self):
print(f'开始{self.name}的用餐')
enjoyHotpot(self.person)
print(f'{self.name}用餐完毕')

print('Yoyo邀请朋友们开始享用火锅')

# 创建子线程
thread1 = DinerThread('小明', 'Thread-1')
thread2 = DinerThread('小王', 'Thread-2')

# 启动子线程
thread1.start()
thread2.start()

time.sleep(0.1)
print('Yoyo先行离开,火锅聚会结束')

守护线程的使用

为了确保主线程在所有子线程完成后才结束,可以通过将子线程设置为守护线程来实现这一目标。


通过调用thread.setDaemon(True)方法,可以将子线程标记为守护线程。这意味着如果主线程结束,即使子线程尚未完成,也将被强制终止。


示例代码


# coding=utf-8
import threading
import time

def enjoyHotpot(person):
print(f'{time.ctime()} {person}正在享用羊肉')
time.sleep(1)
print(f'{time.ctime()} {person}正在品尝鱼丸')


class DinerThread(threading.Thread):
def __init__(self, person, name):
super().__init__()
self.person = person
self.name = name

def run(self):
print(f'开始{self.name}的用餐')
enjoyHotpot(self.person)
print(f'{self.name}用餐完毕')

print('Yoyo邀请朋友们开始享用火锅')

# 创建子线程
thread1 = DinerThread('小明', 'Thread-1')
thread2 = DinerThread('小王', 'Thread-2')

# 设置守护线程
thread1.setDaemon(True)
thread2.setDaemon(True)

# 启动子线程
thread1.start()
thread2.start()

time.sleep(0.1)
print('Yoyo先行离开,火锅聚会结束')

阻塞主线程

若希望主线程等待所有子线程完成后才继续执行,可以使用join()方法。此方法可以让主线程暂停,直到指定的子线程完成其任务。


示例代码


# coding=utf-8
import threading
import time

def enjoyHotpot(person):
print(f'{time.ctime()} {person}正在享用羊肉')
time.sleep(1)
print(f'{time.ctime()} {person}正在品尝鱼丸')


class DinerThread(threading.Thread):
def __init__(self, person, name):
super().__init__()
self.person = person
self.name = name

def run(self):
print(f'开始{self.name}的用餐')
enjoyHotpot(self.person)
print(f'{self.name}用餐完毕')

print('Yoyo邀请朋友们开始享用火锅')

# 创建子线程
thread1 = DinerThread('小明', 'Thread-1')
thread2 = DinerThread('小王', 'Thread-2')

# 启动子线程
thread1.start()
thread2.start()

# 阻塞主线程
thread1.join()
thread2.join()

time.sleep(0.1)
print('Yoyo与朋友们一起结账,火锅聚会圆满结束')

总结

通过以上示例,我们可以看到Python多线程编程中如何利用阻塞操作和守护线程来控制线程的生命周期,从而更好地管理并发任务。这些技术在实际应用中非常有用,可以帮助开发者编写出更加高效和稳定的程序。


推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文介绍如何使用 Python 的 xlrd 库读取 Excel 文件,并将其数据处理后存储到数据库中。通过实际案例,详细讲解了文件路径、合并单元格处理等常见问题。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 开发笔记:2020 BJDCTF Re encode
    开发笔记:2020 BJDCTF Re encode ... [详细]
author-avatar
love留着对她说吧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有