python - 池未使用全部处理器容量
问题描述
我正在使用 Python3 的multiprocessing
库,以便我可以在我的大学集群上执行我的代码。虽然我注意到 aPool
没有以最好的方式分配工作,但我正在寻找一种方法来避免这种情况。例如在这段代码中:
>>> from time import sleep
>>> import multiprocessing as mp
>>>
>>> def f(i):
... if i == 0:
... sleep(4)
... print(i, end='\t')
...
>>> with mp.Pool(2) as pool:
... _ = pool.map(f, range(100))
...
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 0 1 2 34 5 6 7 8 9 10 11 12
我们可以看到,与其他 99 个任务相比,第一个任务需要花费大量时间,但仍然有一个Process
负责 12 个第一个任务。这意味着进程#2 将执行任务 13 -> 99,然后等待进程#1 完成(因此处理 1 -> 12)。这显然不是最优的,因为进程#1 在进程#2 完成任务 1 之前完成。
有没有办法强制 Process #1 只要有一些任务可用就继续执行任务,即在这种情况下强制任务 2 -> 12 在 Process #2 上执行?
我尝试调整chunksize
参数,有点帮助(例如将其设置为 2 强制进程 #1 执行任务 3 -> 12),但这仍然不是最佳的。
解决方案
推荐阅读
- reactjs - firebase_compat_app__WEBPACK_IMPORTED_MODULE_0__.default.database 不是函数
- javascript - innerHTML 通过单击 Ionic 5 的按钮更改字体大小或删除空格
- javascript - 在事件处理程序中调用反应钩子
- typescript - 部分擦除 TypeScript 中的类型参数
- javascript - 在屏幕上显示从 10 到 1 的倒计时,然后在屏幕上显示 Happy Morning。尝试使用承诺
- python - Optional arguments in nested functions in Python
- python - Keysight B1500 的 PyVisa 数据提取问题
- python - 字典操作 - 值
- c# - 打印锯齿状阵列
- css - 如何修改 mat-form-field 轮廓?