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操作时执行其他任务。

相关推荐
Good Note几秒前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
阿正的梦工坊4 分钟前
Sliding Window Attention(滑动窗口注意力)解析: Pytorch实现并结合全局注意力(Global Attention )
人工智能·pytorch·python
喜-喜27 分钟前
Python pip 缓存清理:全面方法与操作指南
python·缓存·pip
rgb2gray28 分钟前
GeoHD - 一种用于智慧城市热点探测的Python工具箱
人工智能·python·智慧城市
我就是我35236 分钟前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆39 分钟前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
PingCAP44 分钟前
TiDB Chat2Query 深度解析:我们如何打造一款更高效、准确的智能 SQL 生成工具?
数据库
MZWeiei1 小时前
Matplotlib,Streamlit,Django大致介绍
python·django·matplotlib
ekkcole1 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
想做富婆1 小时前
数仓搭建实操(传统数仓oracle):[构建数仓层次|ODS贴源层]
数据库·oracle·数仓