如何让调用多Python脚本的单核心Python程序利用全部12个CPU核心
如何让调用多Python脚本的单核心Python程序利用全部12个CPU核心
嗨,看你的代码现在是串行挨个跑这些脚本,确实浪费了12核的性能!别担心,用Python自带的multiprocessing模块就能轻松把这些脚本并行起来,榨干所有核心的潜力。给你两种实用的方案,按需选择:
方案一:用进程池自动管理(简单省心)
这种方式适合脚本数量不多、不需要太精细控制的场景,进程池会自动帮你分配任务到各个核心:
import multiprocessing import time # 先把执行单个脚本的逻辑封装成函数,方便进程调用 def run_single_script(script_path): exec(open(script_path).read()) if __name__ == '__main__': mp_cores = multiprocessing.cpu_count() print(f"This PC has {mp_cores} cores. Now utilizing all of them!") # 把要执行的脚本路径都列在这里 target_scripts = [ "xxxx.py", "xxxxx.py", "xxxxxx.py", "xxxxxxx.py" ] tic = time.perf_counter() # 创建进程池,大小设为CPU核心数(12) with multiprocessing.Pool(processes=mp_cores) as pool: # 并行执行所有脚本 pool.map(run_single_script, target_scripts) toc = time.perf_counter() print(f"TOTAL RUN TIME: {toc - tic:0.2f} seconds")
为啥这么写?
with块会自动帮你处理进程池的创建和销毁,不用手动关闭;pool.map()会把脚本列表里的每个路径,分配给进程池里的空闲进程去执行,12核会同时开工(你只有4个脚本的话,会用4个核心,剩下的核心也会待命,要是以后加脚本就能自动用上)。
方案二:手动创建进程(灵活可控)
如果以后你需要给不同脚本传不同参数、单独监控某个进程的状态,手动创建Process实例会更灵活:
import multiprocessing import time def run_single_script(script_path): exec(open(script_path).read()) if __name__ == '__main__': mp_cores = multiprocessing.cpu_count() print(f"This PC has {mp_cores} cores. Now utilizing all of them!") target_scripts = [ "xxxx.py", "xxxxx.py", "xxxxxx.py", "xxxxxxx.py" ] tic = time.perf_counter() # 先创建所有进程实例 process_list = [] for script in target_scripts: proc = multiprocessing.Process(target=run_single_script, args=(script,)) process_list.append(proc) proc.start() # 启动当前进程 # 等待所有进程都执行完再继续 for proc in process_list: proc.join() toc = time.perf_counter() print(f"TOTAL RUN TIME: {toc - tic:0.2f} seconds")
一些重要提醒
- 资源冲突要避免:如果这些脚本会同时写同一个文件、访问同一个数据库连接,一定要用
multiprocessing.Lock加锁,不然会出现数据乱码或者读写错误; - Windows用户必看:必须把多进程的代码放在
if __name__ == '__main__':里面!因为Windows的进程启动机制会重新导入脚本,不加这个会无限创建进程,直接崩掉; - 进程间数据传递:如果主进程和子脚本需要传递数据,别直接用全局变量(每个进程有独立内存空间),可以用
multiprocessing.Queue或者Pipe来实现通信。
备注:内容来源于stack exchange,提问作者Yusuf
相关产品推荐
相关产品推荐

