Skip to content

Commit 7e28fb8

Browse files
committed
Scheduler - configurable minimum number of jobs per process
1 parent 71bda09 commit 7e28fb8

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

conf/config.neon

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ parameters:
4242
jobSize: 20
4343
processTimeout: 60.0
4444
maximumNumberOfProcesses: 32
45+
minimumNumberOfJobsPerProcess: 2
4546
polluteScopeWithLoopInitialAssignments: true
4647
polluteScopeWithAlwaysIterableForeach: true
4748
polluteCatchScopeWithTryAssignments: false
@@ -152,7 +153,8 @@ parametersSchema:
152153
parallel: structure([
153154
jobSize: int(),
154155
processTimeout: float(),
155-
maximumNumberOfProcesses: int()
156+
maximumNumberOfProcesses: int(),
157+
minimumNumberOfJobsPerProcess: int()
156158
])
157159
polluteScopeWithLoopInitialAssignments: bool()
158160
polluteScopeWithAlwaysIterableForeach: bool()
@@ -388,6 +390,7 @@ services:
388390
arguments:
389391
jobSize: %parallel.jobSize%
390392
maximumNumberOfProcesses: %parallel.maximumNumberOfProcesses%
393+
minimumNumberOfJobsPerProcess: %parallel.minimumNumberOfJobsPerProcess%
391394

392395
-
393396
class: PHPStan\Parser\CachedParser

src/Parallel/Scheduler.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@ class Scheduler
1111
/** @var int */
1212
private $maximumNumberOfProcesses;
1313

14+
/** @var int */
15+
private $minimumNumberOfJobsPerProcess;
16+
1417
public function __construct(
1518
int $jobSize,
16-
int $maximumNumberOfProcesses
19+
int $maximumNumberOfProcesses,
20+
int $minimumNumberOfJobsPerProcess
1721
)
1822
{
1923
$this->jobSize = $jobSize;
2024
$this->maximumNumberOfProcesses = $maximumNumberOfProcesses;
25+
$this->minimumNumberOfJobsPerProcess = $minimumNumberOfJobsPerProcess;
2126
}
2227

2328
/**
@@ -31,7 +36,10 @@ public function scheduleWork(
3136
): Schedule
3237
{
3338
$jobs = array_chunk($files, $this->jobSize);
34-
$numberOfProcesses = min(count($jobs), $cpuCores);
39+
$numberOfProcesses = min(
40+
(int) floor(count($jobs) / $this->minimumNumberOfJobsPerProcess),
41+
$cpuCores
42+
);
3543

3644
return new Schedule(min($numberOfProcesses, $this->maximumNumberOfProcesses), $jobs);
3745
}

tests/PHPStan/Parallel/SchedulerTest.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public function dataSchedule(): array
1313
[
1414
1,
1515
16,
16+
1,
1617
50,
1718
115,
1819
1,
@@ -21,6 +22,7 @@ public function dataSchedule(): array
2122
[
2223
16,
2324
16,
25+
1,
2426
30,
2527
124,
2628
5,
@@ -29,6 +31,7 @@ public function dataSchedule(): array
2931
[
3032
16,
3133
3,
34+
1,
3235
30,
3336
124,
3437
3,
@@ -37,18 +40,29 @@ public function dataSchedule(): array
3740
[
3841
16,
3942
16,
43+
1,
4044
10,
4145
298,
4246
16,
4347
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8],
4448
],
49+
[
50+
16,
51+
16,
52+
2,
53+
30,
54+
124,
55+
2,
56+
[30, 30, 30, 30, 4],
57+
],
4558
];
4659
}
4760

4861
/**
4962
* @dataProvider dataSchedule
5063
* @param int $cpuCores
5164
* @param int $maximumNumberOfProcesses
65+
* @param int $minimumNumberOfJobsPerProcess
5266
* @param int $jobSize
5367
* @param int $numberOfFiles
5468
* @param int $expectedNumberOfProcesses
@@ -57,14 +71,15 @@ public function dataSchedule(): array
5771
public function testSchedule(
5872
int $cpuCores,
5973
int $maximumNumberOfProcesses,
74+
int $minimumNumberOfJobsPerProcess,
6075
int $jobSize,
6176
int $numberOfFiles,
6277
int $expectedNumberOfProcesses,
6378
array $expectedJobSizes
6479
): void
6580
{
6681
$files = array_fill(0, $numberOfFiles, 'file.php');
67-
$scheduler = new Scheduler($jobSize, $maximumNumberOfProcesses);
82+
$scheduler = new Scheduler($jobSize, $maximumNumberOfProcesses, $minimumNumberOfJobsPerProcess);
6883
$schedule = $scheduler->scheduleWork($cpuCores, $files);
6984

7085
$this->assertSame($expectedNumberOfProcesses, $schedule->getNumberOfProcesses());

0 commit comments

Comments
 (0)