为何通过多进程启动单个Python函数比直接调用更快?
为何通过多进程启动单个Python函数比直接调用更快?
这确实是个有点反直觉的问题——按常理说,多进程本身还有启动开销,单个进程跑应该和直接调用差不多甚至更慢才对。不过你自己最终找到的原因非常关键,咱们来把整个逻辑理清楚:
首先还原你的测试场景:
你定义了一个myworkfunction()函数,分别用两种方式执行:
- 多进程调用:通过
multiprocessing.Process启动单个进程执行,耗时26秒
from multiprocessing import Process import time starttime = time.time() pointers = [] pointers.append(Process(target=myworkfunction, args=())) for pointer in pointers: pointer.start() for pointer in pointers: pointer.join() print(time.time() - starttime) # 耗时26秒
- 直接调用:在当前上下文直接执行函数,耗时35秒
starttime = time.time() myworkfunction() print(time.time() - starttime) # 耗时35秒
一开始你怀疑是不是多进程有特殊的内核优先级、或者缓存预加载之类的机制导致更快,但后来你通过测试找到了真正的原因:你的代码是运行在Flask环境中的!
Flask本身是基于线程模型的,当你直接调用函数时:
- 函数的计算任务会和Flask自身的线程任务(比如处理请求、维护服务状态等)共享同一个进程的CPU资源,它们会在同一个执行队列里互相抢占资源,导致你的函数执行被拖慢。
而当你用多进程启动函数时:
- 新进程是完全独立于Flask主进程的,它能获取到独立的CPU资源,相当于和Flask的线程任务并行执行,不会被Flask的后台工作抢占资源,所以反而耗时更短。
你后续也做了验证:脱离Flask环境后,直接调用和多进程调用的耗时几乎一致,这完全坐实了这个结论。
其实这种情况在带有后台服务的场景里很常见,当主进程/线程本身有持续负载时,把耗时任务放到独立进程中,就能避免资源竞争,提升执行效率。
备注:内容来源于stack exchange,提问作者giacomoc
相关产品推荐
相关产品推荐

