欢迎来到 Python 基础入门 Day10!恭喜你已经坚持学习到第十天了!在过去的几天里,我们陆续学习了 Python 的基础语法、数据结构、函数、面向对象编程,以及一些高级特性(如生成器、装饰器和上下文管理器)。今天,我们将深入了解 Python 的多线程与多进程编程,帮助你写出更高效、更快速的代码。
如果你错过了前面的课程,可以点击以下链接进行复习:
- Python 基础入门 Day01
- Python 基础入门 Day02
- Python 基础入门 Day03
- Python 基础入门 Day04
- Python 基础入门 Day05
- Python 基础入门 Day06
- Python 基础入门 Day07
- Python 基础入门 Day08
- Python 基础入门 Day09
目录
- 线程与多线程
- 进程与多进程
- Python
threading
模块 - Python
multiprocessing
模块 - 综合实例:多线程与多进程的应用
- 小结与练习
一、线程与多线程
1.1 什么是线程?
线程是操作系统能够进行运算调度的最小单位,线程被包含在进程之中,是进程中的实际运作单位。
1.2 使用多线程的优势
- 提升程序执行速度:尤其在 I/O 密集型任务中效果显著,如文件读写、网络请求。
- 资源共享:多个线程共享全局变量和数据,通信成本低。
二、进程与多进程
2.1 什么是进程?
进程是操作系统分配资源的基本单位,每个进程拥有独立的内存空间。Python 中每个程序默认都是一个进程。
2.2 使用多进程的优势
- 适合 CPU 密集型任务:如复杂计算、数据处理等。
- 避免 GIL 限制:Python 的 GIL(全局解释器锁)会限制多线程的并发能力,而多进程可以绕开这一限制。
三、Python threading
模块
threading
模块是 Python 标准库中用于实现多线程的模块。
3.1 创建线程
import threading
def print_numbers():
for i in range(5):
print(i)
# 创建线程
t = threading.Thread(target=print_numbers)
t.start()
t.join() # 等待线程完成
3.2 线程锁(Lock)
lock = threading.Lock()
def thread_task():
with lock:
# 线程安全操作
print("安全操作")
threading.Thread(target=thread_task).start()
四、Python multiprocessing
模块
multiprocessing
模块提供了与 threading
模块类似的接口,用于实现多进程。
4.1 创建进程
from multiprocessing import Process
def print_numbers():
for i in range(5):
print(i)
# 创建进程
p = Process(target=print_numbers)
p.start()
p.join()
4.2 进程间通信
使用 Queue
实现进程间数据传递:
from multiprocessing import Process, Queue
def producer(q):
q.put("Hello from Process")
def consumer(q):
print(q.get())
queue = Queue()
p1 = Process(target=producer, args=(queue,))
p2 = Process(target=consumer, args=(queue,))
p1.start()
p2.start()
p1.join()
p2.join()
五、综合实例:多线程与多进程的应用
5.1 多线程处理文件读写
import threading
def read_file(filename):
with open(filename, 'r') as file:
print(file.read())
thread1 = threading.Thread(target=read_file, args=('file1.txt',))
thread2 = threading.Thread(target=read_file, args=('file2.txt',))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
5.2 多进程计算密集型任务
from multiprocessing import Pool
def compute_square(n):
return n * n
if __name__ == "__main__":
with Pool(4) as pool:
result = pool.map(compute_square, range(10))
print(result)
六、小结与练习
今天我们学习了 Python 的 多线程与多进程 编程。掌握这些知识将帮助你提高程序的执行效率,尤其是在处理 I/O 密集型和 CPU 密集型任务时。
今日练习题:
- 使用多线程实现文件的并发读取。
- 使用多进程实现列表中元素的并行平方计算。
- 编写一个程序,比较多线程和多进程在处理相同任务时的性能差异。
- 使用
Queue
实现多进程间的通信。
下一节预告:在 Day11 中,我们将深入探讨 Python 的异步编程(Asyncio),学习如何进一步优化程序性能,敬请期待!