PHP.mk документација

parallel\Runtime

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

class.parallel-runtime.php PHP.net прокси Преводот е вчитан
Оригинал на PHP.net
Патека class.parallel-runtime.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + преведен приказ Кодовите, табелите и белешките остануваат читливи во истиот тек.
parallel\Runtime

Референца за `class.parallel-runtime.php` со подобрена типографија и навигација.

class.parallel-runtime.php

Класата parallel\Runtime

(0.8.0)

Објекти на Runtime

Секој runtime претставува единечна PHP нишка, нишката се креира (и се подигнува) при конструкција. Нишката потоа чека задачи да бидат закажани: Закажаните задачи ќе се извршуваат FIFO и потоа нишката ќе продолжи да чека додека не се закажат повеќе задачи, или додека не се затвори, убие или уништи според нормалните правила за опсег на PHP објекти.

Ги ескејпува специјалните знаци во стринг за употреба во SQL изјава

Кога еден runtime е уништен според нормалните правила за опсег на PHP објекти, тој прво ќе ги изврши сите закажани задачи и ќе блокира додека го прави тоа.

Подигнување на Runtime

Кога се креира нов runtime, тој не споделува код со нишката (или процесот) што го креирала. Ова значи дека нема вчитано исти класи и функции, ниту ист автолоадер. Во некои случаи, многу лесен runtime е пожелен бидејќи задачите што ќе бидат закажани не треба да имаат пристап до кодот во родителската нишка. Во тие случаи кога задачите треба да пристапат до истиот код, доволно е да се постави автолоадер како подигнување.

Забелешка: пре-вчитањето може да се користи заедно со parallel, во овој случај пре-вчитаниот код е достапен без подигнување

Синопсис на класата

final class parallel\Runtime {
/* Креирај */
public __construct()
public __construct(string $bootstrap)
/* Изврши */
public run(Затворање $task): ?Иднината
public run(Затворање $task, array $argv): ?Иднината
/* Придружи се */
public close(): void
public kill(): void
}

Содржина

Белешки од корисници 4 белешки

Лучијано Веторечи
пред 6 години
basic-multithreading-test.php

<?php
use parallel\Runtime;
use parallel\Channel;

$test = "this var is not accesible in a thread";

// this function will be the threads
$thread_function = function (int $id, Channel $ch) {
    // delay the first thread to simulate better multithreading
    // second thread always finishes first
    $sleep = ($id == 2) ? 1 : 2;
    sleep($sleep);

    // print thread id
    // so it's clear second thread goes first
    // and also you can make sure multithreading is working
    var_dump("thread $id sleep $sleep");

    // try to capture globals, but it's not possible
    echo '$GLOBALS["test"] = ';
    @var_dump($GLOBALS["test"]);

    // the only way to share data is between channels
    $ch->send($sleep);
};

try {
    // each runtime represents a thread
    $r1 = new Runtime();
    $r2 = new Runtime();

    // channel where the date will be sharead
    $ch1 = new Channel();

    // args that will be sent to $thread_function
    $args = array();
    $args[0] = null;
    $args[1] = $ch1;

    // running thread 1
    $args[0] = 1;
    $r1->run($thread_function, $args);

    // running thread 2
    $args[0] = 2;
    $r2->run($thread_function, $args);

    // receive data from channel
    $x = $ch1->recv();
    $y = $ch1->recv();

    // close channel
    $ch1->close();

    echo "\nData received by the channel: $x and $y";
} catch (Error $err) {
    echo "\nError:", $err->getMessage();
} catch (Exception $e) {
    echo "\nException:", $e->getMessage();
}
gam6itko
пред 4 години
<?php

// make sure that is really parallel execution (showcase2).
// Then you use echo within task-function there is a real chance that the application will hang.
// We should control Futures to avoid this behaviour.
// You will get different output on each execution.

use parallel\{Future, Runtime};

const THREADS_COUNT = 10;
const THREADS_I_MAX = 100;

// executed within thread
$task = static function (int $i, int $to): void {
    echo "[enter$i]";
    for ($j = 0; $j < $to; $j++) {
        echo $i;
    }
    echo "[exit$i]";
};

// creating a few threads
$runtimeList = [];
for ($i = 0; $i < THREADS_COUNT; $i++) {
    $runtimeList[] = new Runtime();
}
// run all threads
$futureList = [];
foreach ($runtimeList as $i => $runtime) {
    echo "[run$i]";
    $futureList[] = $runtime->run($task, [$i, THREADS_I_MAX]);
}

// waiting until all threads are done
// if you delete code bellow then your script will hang
do {
    usleep(1);
    $allDone = array_reduce(
        $futureList,
        function (bool $c, Future $future): bool {
            return $c && $future->done();
        },
        true
    );
} while (false === $allDone);
echo "done\n";
Михаил Стрелцов (админ на my-fantasy dot ru)
пред 2 години
new Runtime()  will reset some basic (before number 10+-) Linux signal. 

If you already set handle of signal by pcntl_signal function - you need do it again
gam6itko
пред 4 години
<?php

// make sure that is really parallel execution
// you will get different output on each script run

use parallel\{Channel, Runtime};

const THREADS_COUNT = 5;
const THREADS_I_MAX = 10;

$ch = new Channel();

// executed within thread
$task = static function (Channel $ch, int $i, int $to): void {
    echo "[enter: $i]\n";
    for ($j = 0; $j < $to; $j++) {
        $ch->send($i);
    }
    echo "[exit: $i]\n";
};

// creating a few threads
$runtimeList = [];
for ($i = 0; $i < THREADS_COUNT; $i++) {
    $runtimeList[] = new Runtime();
}
// run all threads
foreach ($runtimeList as $i => $runtime) {
    echo "[run: $i]\n";
    $runtime->run($task, [$ch, $i, THREADS_I_MAX]);
}

// reading messages from channel
$queue = '';
for ($i = 0; $i < THREADS_COUNT * THREADS_I_MAX; $i++) {
    $queue .= $ch->recv();
}
$ch->close();

echo $queue . PHP_EOL;
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.