平均分配有2种情况
1)都没有记录的时候,平均分配。
若11个元素,4个cpu,则分配数量为(2, 3, 3, 3),每次分配的起点终点表示区间为
[list*seqno/taskCounters, list*(seqno+1)/taskCounters]
11个数,平均分给4个CPU
header("Content-type: text/html; charset=utf-8");
$list = 11;
$taskCounters = 4;
$result = [];
for ($taskNumber = 0; $taskNumber < $taskCounters; $taskNumber++) {
$seqno = $taskNumber;
//$max = intval($list * ($seqno + 1) / $taskCounters);
//$j = intval($list * $seqno / $taskCounters);
$max = $list * ($seqno + 1) / $taskCounters;
$j = $list * $seqno / $taskCounters;
echo "每次分配的起点终点表示区间为:{$j}--{$max}<br/>";
for ($i = $j; $i < $max; $i++) {
$result[$taskNumber][] = $i;
}
}
场景2:已经有记录了,分配时要保证总量的平均。(比如:每人分3个,有的人已经有2个了,就只需要分1个了)
$list = 14;
$taskCounters = 4;
$result = [['a'], ['b', 't', 'm'], ['c', 'd'], []];
for ($i = 0; $i < $list; $i++) {
foreach ($result as $taskNumber => $info) {
$result_count[$taskNumber] = count($info);
}
$minTaskNumber = array_search(min($result_count), $result_count);
if (min($result_count) < max($result_count)) { //排除相等
$result[$minTaskNumber][] = $i;
} else {
$taskNumber = $i % $taskCounters;
$result[$taskNumber][] = $i;
}
}