python:多线程 简单示例

在Python中,多线程编程通常用于执行I/O密集型任务,因为Python的全局解释器锁(GIL)限制了多线程在CPU密集型任务上的性能提升。不过,对于需要同时处理多个I/O操作(如网络请求、文件读写等)的场景,多线程仍然非常有用。

Python的 threading 模块提供了创建和管理线程的基本工具。以下是一个简单的示例,展示了如何使用threading模块来创建和启动多个线程:

python 复制代码
import threading
import time
 
# 线程执行的函数
def worker(thread_id, delay):
    print(f"线程 {thread_id} 开始工作,延迟 {delay} 秒")
    time.sleep(delay)
    print(f"线程 {thread_id} 完成工作")
 
# 创建线程列表
threads = []
 
# 启动多个线程
for i in range(5):
    thread = threading.Thread(target=worker, args=(i, 2))  # 创建一个线程对象
    threads.append(thread)
    thread.start()  # 启动线程
 
# 等待所有线程完成
for thread in threads:
    thread.join()
 
print("所有线程已完成")

在这个示例中,我们定义了一个简单的worker函数,该函数接受线程ID和延迟时间作为参数,模拟线程的工作。然后,我们创建了5个线程,每个线程都会调用worker函数,并传入不同的参数。最后,我们使用join()方法等待所有线程完成。

线程同步

多线程编程中,线程同步是一个重要问题。如果不加以控制,多个线程可能会同时访问共享资源,导致数据竞争和不一致。Python的threading模块提供了多种同步机制,如锁(Lock)、信号量(Semaphore)、条件变量(Condition)等。

以下是一个使用锁的示例:

python 复制代码
import threading
 
# 共享资源
counter = 0
lock = threading.Lock()
 
# 线程执行的函数
def increment():
    global counter
    for _ in range(100000):
        lock.acquire()  # 获取锁
        counter += 1
        lock.release()  # 释放锁
 
# 创建线程列表
threads = []
 
# 启动多个线程
for _ in range(10):
    thread = threading.Thread(target=increment)
    threads.append(thread)
    thread.start()
 
# 等待所有线程完成
for thread in threads:
    thread.join()
 
print(f"最终计数器值: {counter}")

在这个示例中,我们使用了一个锁来保护对共享资源counter的访问。每个线程在修改counter之前都会先获取锁,修改完成后释放锁。这样可以确保同一时间只有一个线程能够访问counter,从而避免了数据竞争。

注意事项

全局解释器锁(GIL):Python的GIL限制了多线程在CPU密集型任务上的性能提升。对于这类任务,可以考虑使用multiprocessing模块来创建多个进程,每个进程都有自己的Python解释器和内存空间,从而绕过GIL的限制。

线程安全:确保线程访问共享资源时是线程安全的,可以使用锁、信号量等同步机制。

死锁:不当使用锁可能会导致死锁问题,即多个线程相互等待对方释放锁,从而永远无法继续执行。要避免死锁,需要确保每个线程都能按照相同的顺序获取锁。

性能开销:创建和销毁线程是有开销的,不要频繁创建和销毁线程。可以使用线程池(如concurrent.futures.ThreadPoolExecutor)来重用线程。

通过合理使用多线程编程,可以显著提高程序的并发性能和响应速度。然而,也需要注意多线程编程带来的复杂性和潜在问题。

相关推荐
“AI国潮设计-小江”5 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
wenwen_chao5 小时前
Python学习与开发资源合集:实用技巧与工具推荐
python
for_ever_love__6 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司6 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*6 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
XiaoMaqqqq6 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh7 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
惊讶的猫8 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
天赐范式8 小时前
天赐范式第186天:让方差开始自洽——Bulmer效应的闭式验证
python·数字生命·天赐范式·动态运行时·遗传方差·bulmer效应
泡茶喝茶写代码8 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据