一、Python 多线程编程深入
1. 多线程 vs 多进程
多线程 :适合 I/O密集型任务 (如网络请求、文件读写),因为线程在等待I/O时会释放GIL。 多进程 :适合 CPU密集型任务 (如数学计算),因为Python的GIL(全局解释器锁)会限制多线程的并行能力。
2. Python的GIL问题
GIL(Global Interpreter Lock) :同一时刻只有一个线程执行Python字节码。 影响 :多线程无法充分利用多核CPU,但对I/O密集型任务依然有效。 绕过GIL :使用多进程(multiprocessing
模块)或结合C扩展(如numpy
底层用C实现)。
3. 多线程编程核心
代码示例:线程池
import concurrent.futures
import time
def io_bound_task(n):
time.sleep(n) # 模拟I/O等待
return f"Task {n} completed"
# 使用线程池(适合I/O密集型)
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = [executor.submit(io_bound_task, i) for i in [2, 3, 1]]
for future in concurrent.futures.as_completed(futures):
print(future.result())
关键点:
线程安全 :多线程共享数据时需用锁(threading.Lock
),但过度加锁会降低性能。 异步编程 :对于高并发I/O,asyncio
(协程)可能比多线程更高效。
4. 大数据场景中的多线程
适用场景 :数据预处理、分布式任务分发、异步写入数据库等。 注意事项 :
避免在内存中共享大型数据,建议用队列(queue.Queue
)或进程间通信。 大数据处理框架(如PySpark
)底层通过多进程和分布式计算实现并行。
二、JVM 调优核心知识
1. JVM内存模型
2. 垃圾回收(GC)优化
常见GC算法
Serial GC :单线程,适合小应用或客户端。 Parallel GC (默认):多线程,高吞吐量,适合批处理。 CMS(Concurrent Mark Sweep) :低延迟,已废弃。 G1(Garbage-First) :平衡吞吐量和延迟,JDK9+默认。 ZGC :超低延迟(<10ms),适合大堆内存。
调优策略
3. 诊断工具
4. 大数据框架中的JVM调优(如Spark)
三、总结
Python多线程
用对场景 :I/O密集型用多线程,CPU密集型用多进程。 避开GIL :大数据场景推荐用分布式框架(如Dask、PySpark)。
JVM调优
核心原则 :根据应用类型(高吞吐量 vs 低延迟)选择GC算法。 步骤 :
监控GC日志和内存使用。 调整堆大小和GC参数。 压测验证效果。
实战建议
Python大数据 :优先使用PySpark
,其底层由JVM(Scala)处理计算,Python仅作为API。 调优前 :先通过监控找到瓶颈(如频繁Full GC、线程阻塞)。