作者:love留着对她说吧 | 来源:互联网 | 2024-12-11 11:59
本文通过生动的例子讲解了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多线程编程中如何利用阻塞操作和守护线程来控制线程的生命周期,从而更好地管理并发任务。这些技术在实际应用中非常有用,可以帮助开发者编写出更加高效和稳定的程序。