平均分配有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; } }