Una CPU con varios núcleos, PHP y la computación paralela

2021-11-14 - Categorías: General / PHP

Este es un codekata de copia y pega en PHP para procesar lotes de información particionados y repartidos entre varios núcleos de una misma CPU utilizando los conceptos de computación paralela. Es decir, si tenemos un proceso pesado que corre de forma iterativa, y se puede dividir en lotes, entonces se puede procesar en paralelo para aumentar la velocidad.

Esta división y procesado en varios subprocesos de forma simultanea, se puede hacer fácilmente en PHP usando las funciones nativas de pcntl que tenemos disponibles desde PHP 4:
https://www.php.net/manual/es/function.pcntl-fork.php

Show me the code, el código fuente

La cantidad de procesos sería el número de hijos (MAXCHILDS) más uno que es el padre. La cantidad de información que carga en memoria se podría hacer antes del bucle while o dentro de cada hijo (else) para reducirlo. Se pueden usar intervalos de tiempo entre cada lote de procesamiento para reducir uso, al final del while. Entonces, una plantilla de copia y pega podría ser así:

<?php

/**
 * Testing paralell computing..
 */
const MAXCHILDS = 7;

while (true) {
    echo '>>> Starting a batch..'.PHP_EOL;

    // Launch the children..
    $childs = 0;
    for ($i = 0; $i < MAXCHILDS; ++$i) {
        $pid = pcntl_fork();

        if (-1 == $pid) {
            exit('could not fork');
        } elseif ($pid) {
            // Parent..
            ++$childs;
            echo "I'm the parent of $childs children.".PHP_EOL;
        } else {
            // Child..
            $start_time = time();
            $wait_time = rand(3, 10);
            while (true) {
                if (time() - $start_time > $wait_time) {
                    break;
                }
            }
            echo "Bye bye from child $i.".PHP_EOL;
            exit;
        }
    }

    // Wait the children to finish..
    while ($childs > 0) {
        pcntl_wait($status);
        --$childs;
    }

    echo 'All childs ended!'.PHP_EOL;
    echo 'Ending a batch..'.PHP_EOL;
    sleep(2);
}

Me remito a la documentación oficial para más información:
https://www.php.net/manual/es/function.pcntl-fork.php

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

 

© 2022 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.