Python基础——多线程编程

Python多线程是一种并发编程技术,它允许程序同时运行多个线程,每个线程都可以执行程序的一部分。在Python中,多线程通常通过threading模块来实现。下面,我将详细讲解如何使用Python的threading模块来创建和管理多线程。

  1. 导入threading模块
    首先,你需要导入Python的threading模块,这是实现多线程的基础。
python 复制代码
import threading
  1. 定义线程函数
    线程函数是线程执行的任务。它是一个普通的Python函数,但会被线程调用。
python 复制代码
def thread_function(name):
    print(f"Thread {name}: starting.")
    # 模拟线程的工作
    for _ in range(5):
        print(f"Thread {name}: working.")
    print(f"Thread {name}: finishing.")
  1. 创建线程对象
    使用threading.Thread类来创建线程对象。你需要将线程函数作为参数传递给Thread类的构造函数,并可以指定其他参数(如线程名称)。
python 复制代码
thread1 = threading.Thread(target=thread_function, args=("Thread-1",))
thread2 = threading.Thread(target=thread_function, args=("Thread-2",))

注意,args参数是一个元组,即使只有一个参数,也需要加上逗号使其成为元组。

  1. 启动线程
    调用线程对象的start()方法来启动线程。这将导致Python在单独的线程中执行线程函数。
python 复制代码
thread1.start()
thread2.start()
  1. 等待线程完成(可选)
    如果你希望主线程等待所有子线程完成后再继续执行,可以使用threading.Thread.join()方法。
python 复制代码
thread1.join()
thread2.join()

这将阻塞主线程,直到thread1和thread2都完成执行。

  1. 完整示例
    下面是一个完整的Python多线程示例:
python 复制代码
import threading
import time
 
def thread_function(name):
    print(f"Thread {name}: starting.")
    for _ in range(5):
        time.sleep(1)  # 模拟耗时操作
        print(f"Thread {name}: working.")
    print(f"Thread {name}: finishing.")
 
# 创建线程对象
thread1 = threading.Thread(target=thread_function, args=("Thread-1",))
thread2 = threading.Thread(target=thread_function, args=("Thread-2",))
 
# 启动线程
thread1.start()
thread2.start()
 
# 等待线程完成
thread1.join()
thread2.join()
 
print("All threads have finished.")

在这个示例中,thread_function函数模拟了一个耗时操作(使用time.sleep(1)),每个线程都会打印其开始、工作和完成的信息。主线程在启动两个子线程后,使用join()方法等待它们完成。

注意事项

全局解释器锁(GIL):Python的CPython解释器有一个称为全局解释器锁(GIL)的机制,它限制了同一时间只有一个线程可以执行Python字节码。这意味着在多核处理器上,Python的多线程可能不会带来性能上的提升,对于CPU密集型任务,通常建议使用多进程而不是多线程。

线程安全:在多线程编程中,需要特别注意线程安全问题,如数据竞争和死锁。使用线程同步机制(如锁、信号量、条件变量等)可以帮助避免这些问题。

I/O密集型任务:对于I/O密集型任务(如文件读写、网络请求等),多线程仍然可以带来性能上的提升,因为I/O操作通常会阻塞线程的执行,而多线程允许在等待I/O操作时执行其他任务。

相关推荐
yuzhiboyouye几秒前
内连接,左连接,右连接怎么区别开来?
数据库
明月_清风1 分钟前
FastAPI 从入门到实战:3 分钟构建高性能异步 API
后端·python·fastapi
笨拙的老猴子7 分钟前
[特殊字符] Java GC机制详解:G1、ZGC、Shenandoah全面解析与版本演进对比
java·开发语言
bellus-8 分钟前
ubuntu26测试win10的ollama大模型性能
python
水木流年追梦10 分钟前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来10 分钟前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
铭毅天下16 分钟前
Easysearch 版本进化全图——从 ES 国产替代到 AI Native 搜索数据库
大数据·数据库·人工智能·elasticsearch·搜索引擎
liuyunshengsir23 分钟前
PyTorch 动态量化(Dynamic Quantization)
人工智能·pytorch·python
muddjsv23 分钟前
SQL 最常用技能详解与实战示例
数据库·sql·mysql
电子云与长程纠缠31 分钟前
UE5制作六边形包裹球体效果
开发语言·python·ue5