[RESOLU] Script plante à la seconde itération d'une boucle foreach

Petit nouveau ! | 2 Messages

07 sept. 2024, 22:19

Bonjour,

J'ai un script qui lance successivement deux programmes dans des threads parallèles (avec PHP/parallel).
À la première itération du "foreach" tout se passe bien.
Lorsque le script lance le deuxième programme il y a un plantage indiquant qu'une variable n'est pas définie.
Je bloque !

Voici le script
<?php
/**
 * Mise en abyme : parallel executing a parallel script
 * 
 */

use Concurrency\Pool;

require "config.php";
require __DIR__ . "/../../lib/Pool.php";

$tasks['singleQueue'] = function(array $config): array {
    return require "singleQueue.php";
};

$tasks['multipleQueues'] = function(array $config): array {
    return require "multipleQueues.php";
};

function generator(array $config) {
    for ($i=1 ; $i <= $config['iterations_count']; $i++) {
        yield [$config];
    }
}

foreach ($tasks as $name => $task) {

    //Create generator
    $generator = generator($config);

    $pool = new Pool(
        concurrency: $config['simulate_threads_count'],
        task: $task,
        generator: $generator,
    );

    $pool->wait();

    $results = $pool->getValues();

    echo "== $name ==\n";
    $count = count($results);
    echo "Number of iterations: $count\n";
    $column = array_column($results, 'clients_count');
    $average_clients_count = round(array_sum($column) / $count, 1);
    echo "Average clients count: $average_clients_count\n";

    $column = array_column($results, 'total_duration');
    $average_total_duration = round(array_sum($column) / $count);
    echo "Average total duration: {$average_total_duration}s\n";

    $column = array_column($results, 'max_wait_duration');
    $average_max_wait_duration = round(array_sum($column) / $count);
    echo "Average max wait duration: {$average_max_wait_duration}s\n";

    $column = array_column($results, 'average_wait_duration');
    $average_average = round(array_sum($column) / $count);
    echo "Average average wait duration: {$average_average}s\n";

    $simulation_duration = round($pool->getWaitDuration(), 1);
    echo "Simulation duration: {$simulation_duration}s\n";
    echo "\n";

}

Voici l'erreur :

Code : Tout sélectionner

Fatal error: Uncaught TypeError: {closure}(): Argument #2 ($queue_channel) must be of type parallel\Channel, array given in /app/tutorial/example10/main.php:25 Stack trace: #0 [internal function]: {closure}(Object(parallel\Channel), Array, Array) #1 {main} thrown in /app/tutorial/example10/main.php on line 25

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 sept. 2024, 10:59

Bonjour,
J'ai jamais utilisé l'extension parallel donc pas vraiment inspiré sur l'origine du problème.
A noter qu'il ne te dit pas que la variable n'est pas définie, mais que c'est un tableau au lieu d'un parallel\Channel...
Ta ligne 25 de main.php, c'est le foreach ?

Tu fais un yield [$config] dans ton code or $config est déjà un array, c'est normal que tu fasses un array d'array à ce niveau ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 2 Messages

09 sept. 2024, 18:07

Bonjour,

J'ai la réponse : il s'agit d'un bug de l'extension php/parallel qui réutilise une fonction anonyme en "croyant" que c'est la même que la précédente.
Résolu dans l'immédiat en activant opcache.
Voir : https://github.com/krakjoe/parallel/issues/309

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

10 sept. 2024, 17:49

Ah ! Bien vu :-D
Merci pour le partage
Quand tout le reste a échoué, lisez le mode d'emploi...