我有一个项目,我将大量 .tif 图像转换为 PDF 文档。文件数达到数百万。
为了加快我使用 Amphp 的过程。由于使用 Imagemagick 转换图像的过程占用了一些 cpu 功率,我想限制并行运行的转换器进程的最大数量。
我的第一种方法有效,但如果我将文件排队而不是给一定数量的工作人员一个 x 文件数组,则可以改进。
这是我当前的代码,我尝试在其中复制示例。
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
$constants = get_defined_constants(true);
$constants = $constants['user'];
$maxFileCount = THREAD_CHUNKSIZE * THREAD_COUNT;
$i = 0;
$folder = opendir(LOOKUP_PATH);
$tasks = [];
while ($i < $maxFileCount && (false !== ($import_file = readdir($folder)))) {
$fileParts = explode('.', $import_file);
$ext = strtolower(end($fileParts));
if($ext === 'xml') {
$filePath = LOOKUP_PATH. 'xml'.DIRECTORY_SEPARATOR.$import_file;
$tasks[] = new ConvertPdfTask([$filePath], $constants);
}
$i++;
}
if(!empty($tasks)) {
Amp\Loop::run(function () use ($tasks) {
$coroutines = [];
$pool = new Amp\Parallel\Worker\DefaultPool(THREAD_COUNT);
foreach ($tasks as $index => $task) {
$coroutines[] = Amp\call(function() use ($pool, $task) {
return yield $pool->enqueue($task);
});
}
$results = yield Amp\Promise\all($coroutines);
return yield $pool->shutdown();
});
}
我的问题是,一旦我加入的任务数量超过了THREAD_COUNT
任务数量,我就会收到以下 PHP 警告:Warning: Worker in pool exited unexpectedly with code -1
并且没有创建任何 PDF。
只要我保持在最大池大小以下,一切都很好。
我在 Windows 10 和 amphp/parallel 1.4.0 上使用 PHP 7.4.9。