热门标签 | 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爬虫Demo
    1爬虫功能:爬取某域名下所有网页,比如爬取python文档 https:docs.python.orgzh-cn3 ,爬取之后, ... [详细]
  • 本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。 ... [详细]
  • Python基础入门:理解字符集与编码
    本文首先探讨了计算机的基本工作原理——二进制系统,进而深入介绍了字符集的概念及其在不同编码标准(如ASCII、GB2312、GBK、Unicode及UTF-8)中的应用。此外,文章还简要介绍了Python的安装、基本运行环境配置、变量定义、字符串处理、用户输入输出、条件判断及循环控制结构。 ... [详细]
  • 本文通过Python编程语言,利用Pandas和Matplotlib库,对电影数据集中的类型字段进行处理,实现电影类型的统计分析及可视化展示。 ... [详细]
  • IO包中的其他类【JAVA基础】
    IO包中的其他类管道流:IO流和多线程相结合案例对象的序列化:将学生对象存进硬盘和取出随机访问文件RandomAccessFile类指定读取案例操作基本数据类型的对象 ... [详细]
  • 本文介绍了如何使用Python在字符串列表的每个K个字符之后插入指定的值,提供了两种不同的实现方法。 ... [详细]
  • 本文探讨了在Python中利用sqlite3库创建或重定义SQLite函数的方法,包括自定义函数和修改现有函数的行为。 ... [详细]
  • Python 3 引入了对文本和二进制数据的明确区分,其中文本使用 Unicode 编码,并通过 str 类型表示,而二进制数据则由 bytes 类型表示。这种区分避免了 Python 2 中常见的混淆问题,增强了程序的清晰性和安全性。 ... [详细]
  • 我目前正在通过以下编程练习进行训练: ... [详细]
  • 高效处理大文件:单线程与多线程下的词频统计方法
    本文探讨了在处理大文件时,如何通过单线程和多线程的方式使用Buffer流进行词频统计,以避免一次性加载文件导致的内存溢出问题,并提供了具体的实现代码。 ... [详细]
  • 本文详细介绍了Python中字符串的一些常用处理方法,包括大小写转换、字符串替换、查找子串等操作,并通过实例代码展示了这些方法的具体使用方式。 ... [详细]
  • 本文深入探讨了Apache服务器中Prefork MPM的工作原理,特别是预创建机制及其如何确保高效、稳定的并发处理能力。 ... [详细]
  • 探索Java堆外内存:超越JVM限制的新途径
    本文深入探讨了Java堆外内存的应用及其对性能的提升,特别是如何通过堆外内存绕过JVM的限制,解决内存不足的问题。 ... [详细]
  • 本文介绍如何使用 Python 的单行代码来绘制一个精美的爱心图案。通过调整字符和数学表达式,可以在控制台中输出由特定字符串组成的爱心形状。 ... [详细]
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
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社区 版权所有