import threading
counter = 0
def unsafe_increment():
global counter
for _ in range(100000):
counter += 1 # 存在竞态:读-改-写非原子操作
threads = [threading.Thread(target=unsafe_increment) for _ in range(5)]
for t in threads:
t.start()
for t in threads:
t.join()
print(counter) # 输出通常小于预期的500000
from multiprocessing import Pool
def square(x):
return x ** 2
if __name__ == '__main__':
with Pool(4) as p:
result = p.map(square, [1, 2, 3, 4, 5])
print(result) # 输出: [1, 4, 9, 16, 25]
from multiprocessing import Pool
def process_data(x):
return x ** 2
if __name__ == '__main__':
data = [1, 2, 3, 4, 5]
with Pool() as pool:
result = pool.map(process_data, data)
print(result) # 输出: [1, 4, 9, 16, 25]
该代码创建一个进程池,并行计算列表中每个元素的平方。pool.map 自动将任务分发到多个 CPU 核心,适用于 CPU 密集型操作。
from multiprocessing import Pool
def task(n):
return n ** 2
if __name__ == '__main__':
with Pool(4) as p:
result = p.map(task, range(10)) # 主进程在此阻塞
print(result)
上述代码中,p.map() 调用后主进程被锁定,直到全部10个任务执行完毕并返回结果列表。
资源消耗对比
进程数
执行时间(秒)
内存占用(MB)
2
2.1
85
4
1.3
156
2.4 常见使用误区与性能瓶颈规避
过度同步导致锁竞争
在高并发场景下,频繁使用 synchronized 或 ReentrantLock 可能引发线程阻塞。应优先考虑无锁结构,如 AtomicInteger 或 CAS 操作。
// 错误示例:方法级同步
public synchronized void updateCounter() {
counter++;
}
// 正确示例:使用原子类
private AtomicInteger counter = new AtomicInteger(0);
public void updateCounter() {
counter.incrementAndGet();
}
上述代码中,synchronized 会阻塞所有调用线程,而 AtomicInteger 利用底层 CPU 的 CAS 指令实现无锁递增,显著提升吞吐量。
from concurrent.futures import ThreadPoolExecutor
def task(n):
return n * n
def data_generator():
for i in range(1000):
yield i
with ThreadPoolExecutor(max_workers=4) as executor:
results = executor.imap(task, data_generator())
for result in results:
print(result)
func generate(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out // 返回只读通道,启动惰性生成
}