当前位置:
首页 > Python基础教程 >
-
Python多线程Threading、子线程与守护线程实例详解
当然,Python的`threading`模块提供了基本的线程和同步原语支持。在这个模块中,你可以创建线程、守护线程以及使用各种同步机制来控制线程的执行。下面,我将通过一些实例来详细解释这些概念。
### 1. 基本的线程创建
首先,我们来看如何使用`threading.Thread`类来创建一个基本的线程。
### 2. 守护线程(Daemon Threads)
守护线程是一种特殊的线程,它会在主线程结束时自动退出,不管它是否完成了任务。守护线程主要用于那些必须在主程序退出前完成的后台任务,如清理工作等。
在这个例子中,守护线程`daemon_thread`将不会无限循环下去,因为主线程结束了,而`daemon_thread`被设置为守护线程。
### 3. 线程同步
当多个线程需要共享资源时,就需要进行线程同步,以防止数据竞争和条件竞争。Python的`threading`模块提供了多种同步机制,如锁(Lock)、条件变量(Condition)、信号量(Semaphore)等。
这里,我们简单展示如何使用锁(Lock)来同步线程。
在这个例子中,我们创建了两个线程来同时修改一个全局变量`counter`。通过使用锁,我们确保了在任何时刻只有一个线程能够修改`counter`,从而避免了数据竞争。
这些只是`threading`模块中的冰山一角。Python的`threading`模块还提供了许多其他功能,如事件(Event)、定时器(Timer)等,你可以根据具体需求来探索和使用它们。
最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python50142.html
### 1. 基本的线程创建
首先,我们来看如何使用`threading.Thread`类来创建一个基本的线程。
import threading
import time
def print_numbers():
for i in range(5):
time.sleep(1)
print(i)
# 创建线程
thread = threading.Thread(target=print_numbers)
# 启动线程
thread.start()
# 主线程继续执行
for i in 'abcde':
time.sleep(0.5)
print(i)
# 等待子线程完成(在这个例子中,其实主线程已经结束,因为Python解释器会等待所有非守护线程完成)
thread.join()
import time
def print_numbers():
for i in range(5):
time.sleep(1)
print(i)
# 创建线程
thread = threading.Thread(target=print_numbers)
# 启动线程
thread.start()
# 主线程继续执行
for i in 'abcde':
time.sleep(0.5)
print(i)
# 等待子线程完成(在这个例子中,其实主线程已经结束,因为Python解释器会等待所有非守护线程完成)
thread.join()
### 2. 守护线程(Daemon Threads)
守护线程是一种特殊的线程,它会在主线程结束时自动退出,不管它是否完成了任务。守护线程主要用于那些必须在主程序退出前完成的后台任务,如清理工作等。
import threading
import time
def daemon_task():
while True:
time.sleep(1)
print("Daemon is still running")
# 创建守护线程
daemon_thread = threading.Thread(target=daemon_task)
daemon_thread.daemon = True # 设置为守护线程
# 启动线程
daemon_thread.start()
# 主线程结束,守护线程也会跟着结束
print("Main thread ending...")
import time
def daemon_task():
while True:
time.sleep(1)
print("Daemon is still running")
# 创建守护线程
daemon_thread = threading.Thread(target=daemon_task)
daemon_thread.daemon = True # 设置为守护线程
# 启动线程
daemon_thread.start()
# 主线程结束,守护线程也会跟着结束
print("Main thread ending...")
在这个例子中,守护线程`daemon_thread`将不会无限循环下去,因为主线程结束了,而`daemon_thread`被设置为守护线程。
### 3. 线程同步
当多个线程需要共享资源时,就需要进行线程同步,以防止数据竞争和条件竞争。Python的`threading`模块提供了多种同步机制,如锁(Lock)、条件变量(Condition)、信号量(Semaphore)等。
这里,我们简单展示如何使用锁(Lock)来同步线程。
import threading
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
lock.acquire() # 获取锁
try:
counter += 1
finally:
lock.release() # 释放锁
threads = []
for _ in range(2):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"Final counter: {counter}")
counter = 0
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
lock.acquire() # 获取锁
try:
counter += 1
finally:
lock.release() # 释放锁
threads = []
for _ in range(2):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"Final counter: {counter}")
在这个例子中,我们创建了两个线程来同时修改一个全局变量`counter`。通过使用锁,我们确保了在任何时刻只有一个线程能够修改`counter`,从而避免了数据竞争。
这些只是`threading`模块中的冰山一角。Python的`threading`模块还提供了许多其他功能,如事件(Event)、定时器(Timer)等,你可以根据具体需求来探索和使用它们。
最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python50142.html
栏目列表
最新更新
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
Java使用poi生成word文档的简单实例
计算机二级考试MySQL常考点 8种MySQL数据库
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比