社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python:多线程 简单示例

进击的Coder • 3 周前 • 21 次点击  
这是「进击的Coder」的第 961 篇技术分享
作者:belldeep
来源:https://blog.csdn.net/belldeep/article/details/144872109

阅读本文大概需要 5 分钟。



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

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

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)等。

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

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)来重用线程。

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




点个在看你最好看

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/177634
 
21 次点击