python多线程编程详解

在Python中,多线程编程是一种常用的技术,用于并行执行多个任务以提高程序的运行效率。Python标准库中的threading模块提供了多线程支持。

‌线程(Thread)‌ 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

2. 使用threading模块

Python的threading模块允许你创建和管理线程。

import threading

import time

def task():

print(f"Task started by {threading.current_thread().name}")

time.sleep(2) # 模拟耗时操作

print(f"Task finished by {threading.current_thread().name}")

# 创建线程

thread = threading.Thread(target=task)

thread.start() # 启动线程

thread.join() # 等待线程完成

3. 线程的生命周期

线程的生命周期包括以下几个阶段:

  • ‌新建(New)‌:当使用Thread类创建了一个线程对象后,该线程进入新建状态。
  • ‌就绪(Runnable)‌:当线程对象调用了start()方法后,该线程进入就绪状态,等待CPU调度执行。
  • ‌运行(Running)‌:当线程获取CPU资源后开始执行,处于运行状态。
  • ‌阻塞(Blocked)‌:线程在运行过程中可能会等待某些资源(如I/O操作、锁等),此时线程会进入阻塞状态。
  • ‌死亡(Dead)‌:当线程的任务执行完毕或被终止后,线程进入死亡状态。

4. 同步和锁(Locks)

在多线程环境中,为了避免数据竞争和条件竞争等问题,通常需要使用锁(Locks)。Python的threading模块提供了多种锁:

  • ‌互斥锁(Mutex)‌:最基本的锁,同一时刻只有一个线程可以持有这个锁。
  • ‌条件变量(Condition)‌:基于锁的高级同步原语,允许一个或多个线程等待某个条件的发生。
  • ‌信号量(Semaphore)‌:允许多个线程同时访问某个资源,但访问的线程数量由信号量控制。
  • ‌事件(Event)‌:允许一个或多个线程等待某些事件的发生。
  • ‌定时器(Timer)‌:在指定时间后执行某个函数

 

实现多线程编程的常用库主要包括以下几种:

1. ‌threading‌(标准库)

  • ‌功能‌:提供基本的线程创建、同步机制(如锁、条件变量)和线程管理功能。
  • ‌核心类‌:
    • Thread:用于创建和管理线程。
    • Lock/RLock:互斥锁和可重入锁,用于线程同步。
    • Event:线程间通信机制。
    • Semaphore:控制并发线程数量。
  • ‌适用场景‌:适用于I/O密集型任务(如网络请求、文件操作),因Python的GIL限制在CPU密集型任务中效果有限12。

2. ‌concurrent.futures‌(标准库)

  • ‌功能‌:提供高级接口,简化线程池和进程池的创建与管理。
  • ‌核心类‌:
    • ThreadPoolExecutor:线程池执行器,支持异步任务提交和结果收集。
    • ProcessPoolExecutor:进程池执行器,适用于CPU密集型任务。
  • ‌优势‌:接口与threading相似,但更易用且支持任务调度。

3. ‌multiprocessing‌(标准库)

  • ‌功能‌:通过进程实现真正的并行计算,绕过GIL限制。
  • ‌核心类‌:
    • Process:用于创建进程。
    • Pool:进程池管理器,支持任务分发和结果收集。
  • ‌适用场景‌:适用于CPU密集型任务或需要隔离内存的场景4。

4. ‌queue‌(标准库)

  • ‌功能‌:提供线程安全的队列实现,用于线程间数据传递。
  • ‌核心类‌:
    • Queue:先进先出队列。
    • LifoQueue:后进先出队列。
    • PriorityQueue:优先级队列。
  • ‌适用场景‌:生产者-消费者模式。

5. ‌asyncio‌(标准库)

  • ‌功能‌:基于协程的异步编程框架,适用于I/O密集型任务。
  • ‌核心概念‌:
    • async/await:定义异步函数和挂起点。
    • EventLoop:事件循环管理器。
  • ‌优势‌:非阻塞I/O操作,性能优于多线程5。

6. ‌ctypes‌(标准库)

  • ‌功能‌:提供C语言接口调用,用于底层线程操作(如直接操作GIL)。
  • ‌适用场景‌:需要精细控制线程行为的高级场景。

7. ‌第三方库‌

  • ‌gevent‌:基于协程的并发库,通过greenlet实现轻量级线程。
  • ‌eventlet‌:类似gevent,适用于网络编程。

选择建议

  • ‌I/O密集型任务‌:优先使用threadingconcurrent.futures.ThreadPoolExecutor12。
  • ‌CPU密集型任务‌:使用multiprocessingconcurrent.futures.ProcessPoolExecutor4。
  • ‌复杂场景‌:结合queue实现生产者-消费者模型,或使用asyncio优化I/O操作5。

‌注意‌:Python的GIL(全局解释器锁)限制了多线程在CPU密集型任务中的性能,多进程(multiprocessing)是绕过GIL的替代方案

在C++、C、C#、Python和Java中实现多线程编程的示例

C++11:使用头文件,std::thread t(func);

C:使用pthread库,pthread_create(&thread,NULL,func,NULL);

C#:Thread thread = new Thread(new ThreadStart(func));

Python:threading.Thread(target=func).start()

Java:new Thread(new MyRunnable()).start();

解析:不同编程语言中多线程的实现方法。在C++标准中,可以通过头文件创建线程,使用std::thread类。C语言通常使用POSIX线程库(pthread)的pthread_create函数。C#中使用Thread类创建线程实例。Python通过threading模块,可以继承Thread类或直接使用函数创建线程。Java则通过实现Runnable接口或继承Thread类来创建线程。各语言实现方式虽有差异,但核心思想都是创建线程对象并指定要执行的代码。

python的多线程编程适用于I/O 密集型任务,可以提高程序效率:

创建线程  使用threading.Thread 类或者继承;

线程同步  使用LOCK,RLock  Semaphore, Event,Condition 同步原语

线程通信  使用Quene 进行安全的数据交互

线程池  使用  concurrent。futures。ThreadPoolExecutor  管理线程

 

 

参考: https://blog.csdn.net/lyx3313696759/article/details/149945199

 

posted @ 2025-12-12 16:01  konglingbin  阅读(0)  评论(0)    收藏  举报