Python多进程指定10核却仅占用2核的问题咨询
Python多进程指定10核却仅占用2核的问题咨询
大家好,我刚接触多进程,可能这个问题有点入门级,但实在搞不清楚原因,想请教各位大佬:
我当前的环境是Ubuntu 20.04.6 LTS(64位),处理器是12代Intel(R) Core(TM) i7-12700K,内存16GB,用的Python版本是3.9.19。
最开始我运行下面这段代码时,用htop命令查看,能看到10个核都被正常利用了:
import time def fun(ele): ele ** 1000 if __name__ == '__main__': import multiprocessing input_list = [1000] * 10000000 start_time = time.time() pool = multiprocessing.Pool(10) result = pool.map(func=fun, iterable=input_list) pool.close() pool.join() end_time = time.time() print(end_time - start_time)
但是当我导入一些额外的库(比如PIL、numpy这些)之后,奇怪的现象出现了:虽然确实创建了11个进程(1个主进程+10个子进程),但看起来只有2个核在工作。修改后的代码如下:
import time from PIL import Image import numpy as np import pickle import os import torch def fun(ele): ele ** 1000 if __name__ == '__main__': import multiprocessing input_list = [1000] * 10000000 start_time = time.time() pool = multiprocessing.Pool(10) result = pool.map(func=fun, iterable=input_list) pool.close() pool.join() end_time = time.time() print(end_time - start_time)
我用命令ps aux | grep [p]ython | grep $name_of_program$ | wc -l确认过,确实是有11个进程在运行,但这些进程好像没有被分配到所有CPU核上。
不过后来我把多进程的启动方法设置为spawn(用multiprocessing.set_start_method('spawn'))之后,10个核又能正常被全部利用了,代码如下:
import time from PIL import Image import numpy as np import pickle import os import torch def fun(ele): ele**1000 if __name__ == '__main__': import multiprocessing multiprocessing.set_start_method('spawn') input_list = [1000]*10000000 start_time = time.time() pool = multiprocessing.Pool(10) result = pool.map(func=fun, iterable=input_list) pool.close() pool.join() end_time = time.time() print(end_time-start_time)
现在我有几个疑问想请教大家:
- 为什么第二种情况里只有2个核被利用?
- 这个问题会不会和我导入额外库导致的内存限制有关?
- 如果用
fork启动方法的话,我该怎么做才能让进程均匀分配到所有CPU核上?
备注:内容来源于stack exchange,提问作者user17349469
相关产品推荐
相关产品推荐

