Python如何使用多线程实现代码非串行执行?
问题根源
你写的多线程代码串行执行的核心原因是:循环内每启动一个线程就立刻调用join()方法阻塞主线程,必须等当前子线程运行结束才会启动下一个,自然就变成了串行逻辑。
除此之外你的代码还有三个问题:
- 共享全局变量没有加线程锁,多线程同时修改会出现竞态条件,最终计算结果不准确
- 最小值计算逻辑存在边界错误,n=0时
n-1=-1会取到数组最后一位元素,原有比较逻辑完全冗余 - 没必要通过kwargs传递全局字典,参数使用逻辑混乱
修正后代码
数组求和
import threading matrix = [6,5,4,3,2,1,0] sum_res = {"value": 0} lock = threading.Lock() def sum_task(index): global sum_res, lock current_val = matrix[index] # 仅修改共享变量时加锁,减少锁粒度提升效率 with lock: sum_res['value'] += current_val thread_pool = [] # 先启动所有线程 for i in range(len(matrix)): t = threading.Thread(target=sum_task, args=(i,)) t.start() thread_pool.append(t) # 所有线程启动完成后再统一等待执行结束 for t in thread_pool: t.join() print("Suma: ", sum_res['value'])
求数组最小值
import threading matrix = [6,5,4,3,2,1,0] min_res = {"value": float('inf')} lock = threading.Lock() def min_task(index): global min_res, lock current_val = matrix[index] # 先做无锁判断,只有满足修改条件时再加锁 if current_val < min_res['value']: with lock: # 加锁后二次校验,避免加锁前已被其他线程更新过最小值 if current_val < min_res['value']: min_res['value'] = current_val thread_pool = [] for i in range(len(matrix)): t = threading.Thread(target=min_task, args=(i,)) t.start() thread_pool.append(t) for t in thread_pool: t.join() print("Minimum: ", min_res['value'])
补充说明
CPython解释器存在全局解释器锁(GIL),CPU密集型任务用多线程无法实现真正的多核并行,仅能做到线程间并发调度,如果你是做CPU密集型计算,还是更推荐用多进程实现。
内容的提问来源于stack exchange,提问作者neekitit
相关产品推荐
相关产品推荐

