Python多线程运行同一函数无并行加速效果,如何实现线程同时运行?
原因分析
- 首先你的多线程代码逻辑本身就是串行执行的:你在每个线程
start()后立刻调用了join(),这会阻塞主线程直到当前子线程完全运行结束,才会启动下一个线程,本质和单线程执行顺序完全一致,自然不会有速度提升。 - 条件判断存在语法错误:
if choice == 's' or 'S'的写法永远返回True,因为非空字符串'S'的布尔值为真,所以你输入m的时候根本不会进入多线程分支,永远跑的是单线程逻辑。正确写法为if choice.lower() == 's'。 - 函数逻辑存在越界隐患:
fib_caller里固定写了循环10次,但你多线程分支传入的是长度为2的列表切片,执行时会直接报索引越界错误。同时你用了list作为变量名,覆盖了Python内置的list类型,还滥用全局变量,写法极不规范。 - CPython全局解释器锁(GIL)限制:就算你把上述代码逻辑都改对,计算密集型的斐波那契任务用
threading多线程也无法实现并行。因为CPython的GIL会保证同一时间只有一个线程能执行Python字节码,多线程在计算密集型场景下只会有GIL切换的额外开销,速度甚至可能比单线程更慢。计算密集型任务要实现多核并行,应该改用multiprocessing多进程模块,每个进程拥有独立的解释器和GIL,可以跑在不同CPU核心上。
修正后的可运行示例
import multiprocessing, time def fib(n): if n <= 1: return 1 return fib(n - 1) + fib(n - 2) def fib_caller(l, res_list, start_idx): for i in range(len(l)): x = fib(l[i]) print(x) res_list[start_idx + i] = x if __name__ == '__main__': task_list = [1, 37, 1, 37, 1, 37, 1, 37, 1, 37] manager = multiprocessing.Manager() res_list = manager.list(task_list) choice = input( "请选择执行模式:\n单进程模式: 输入s\n多进程模式: 输入m\n") begin = time.time() if choice.lower() == 's': fib_caller(task_list, res_list, 0) elif choice.lower() == 'm': # 拆分任务为5组,每组2个任务 task_groups = [ (task_list[0:2], res_list, 0), (task_list[2:4], res_list, 2), (task_list[4:6], res_list, 4), (task_list[6:8], res_list, 6), (task_list[8:10], res_list, 8), ] processes = [] # 先启动所有进程 for args in task_groups: p = multiprocessing.Process(target=fib_caller, args=args) p.start() processes.append(p) # 统一等待所有进程执行完成 for p in processes: p.join() else: print('输入无效.') print(list(res_list)) end = time.time() total = end - begin print(f"总执行时间: {total}")
修正后多进程模式的执行时间会接近单进程的1/5(取决于你的CPU核心数)。
内容的提问来源于stack exchange,提问作者Qosay Al-Shatel
相关产品推荐
相关产品推荐

