Python 实现多线程主要靠 threading 模块。最常用的两种方式:一是直接给 threading.Thread 传一个 target 函数,二是继承 Thread 类然后重写 run 方法。
Pythonimport threading
import time
def print_numbers():
for i in range(5):
print(f'Number: {i}')
time.sleep(1)
def print_letters():
for letter in 'abcde':
print(f'Letter: {letter}')
time.sleep(1)
# 创建线程
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
print('Done.')
上面这段代码创建了两个线程分别跑 print_numbers 和 print_letters。调用 start() 让线程开始执行,join() 则是让主线程等着子线程跑完再继续往下走。
线程的生命周期大致是:创建线程对象 → 调用 start() 进入就绪状态 → 获取 CPU 时间片开始执行 → 执行完毕或遇到 join() 等待 → 线程结束
核心思路就是分而治之,不要把整个文件一股脑儿塞进内存,而是一点一点地读、一点一点地处理。
Python 提供了两种主流方案:逐行读取和分块读取。
两种方式都能把 8G 文件的内存占用压到几 KB 到几 MB 级别。
Python 的继承就是让一个类直接拿到另一个类的属性和方法,不用重复写一遍。子类继承父类之后,父类有的东西子类全都能用,想改就重写对应的方法就行。
Python 跟 Java 不一样的地方在于它支持 多继承,一个子类可以同时继承多个父类。多继承虽然灵活,但也带来了方法冲突的问题,Python 用 MRO 来确定方法调用顺序。来看个最直观的例子:
在使用 Python 的 requests 库上传文件时,如果文件名包含中文,你可能会遇到一个诡异的问题:
filename*=utf-8''...)。即便你尝试了 encode('utf-8').decode('latin-1') 等常规编码转换,问题依然可能存在。
在Python开发中,装饰器(Decorator)是一个非常强大的特性。
它可以在 不修改原函数代码的情况下扩展函数功能,被广泛应用于:
本文将从 原理 → 实现 → 实战应用 逐步讲解Python装饰器。