Heim >Backend-Entwicklung >PHP8 >PHP8.1 Fiber führt Cross-Multitasking aus (mit detaillierter Code-Erklärung)

PHP8.1 Fiber führt Cross-Multitasking aus (mit detaillierter Code-Erklärung)

藏色散人
藏色散人nach vorne
2021-12-20 10:49:394126Durchsuche

Nehmen Sie die for-Schleife, die normalerweise jeder schreibt, als Beispiel. Wie bei go können Sie zwei

schreiben und in jede eine Schleife schreiben, um sie gleichzeitig einzugeben. Sie können sehen, dass die Ausgabe abwechselnd ist. Wenn in früheren PHP-Versionen nur eine CLI geöffnet und mehrere for-Schleifen geschrieben wurden, muss die Ausgabe sequentiell erfolgen. Eine übergreifende Ausgabe kann nicht erreicht werden (dh nach mehrmaliger Ausführung in der ersten Schleife kann b erneut ausgeführt werden, b kann für einen bestimmten Zeitraum ausgeführt werden und dann kann A ausgeführt werden).

Mit Hilfe von Ballaststoffen können wir diesen Vorgang nun auch erreichen. [Empfohlenes Lernen: goPHP-Video-Tutorial

]

Der folgende Code kann die übergreifende Ausführung von zwei Schleifen erreichen. Sie können sogar die Ausführungshäufigkeit von zwei Programmen steuern (zum Beispiel wird A dreimal und B einmal ausgeführt)

<?php
$t1    = false;
$t2    = false;
$reg   = [];
$reg[] = new \Fiber(function () use (&$t1) {
    for ($i = 1; $i < 10; $i++) {
        echo $i;
        echo PHP_EOL;
        \Fiber::suspend();

    }
    $t1 = true;
});


$reg[] = new \Fiber(function () use (&$t2) {
    for ($i = 1; $i < 10; $i++) {
        echo $i;
        echo PHP_EOL;
        \Fiber::suspend();
    }
    $t2 = true;
});

$startTag = true;
while (count($reg) > 1) {

    if ($startTag) foreach ($reg as $pI) {
        $pI->start();
        $startTag = false;
    }

    foreach ($reg as $pI) {
        $pI->resume();
    }

    if ($t1 === true && $t2 === true) {
        break;
    }
}
rreee

Sie können sogar die Ausführungshäufigkeit von zwei Schleifen steuern, zum Beispiel nachdem die erste Schleife dreimal ausgeführt wurde , die zweite Schleife Einmal ausführen. Der Code lautet wie folgt:

1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
<?php
$reg = [];
$fId = 1;


$reg[$fId] = new \Fiber(function () use (&$reg, $fId) {
    for ($i = 1; $i < 10; $i++) {
        echo $fId . &#39;:&#39; . $i;
        echo PHP_EOL;
        if ($i % 3 == 0) {
            \Fiber::suspend();
        }
    }
    unset($reg[$fId]);
});
$fId++;

$reg[$fId] = new \Fiber(function () use (&$reg, $fId) {
    for ($i = 1; $i < 10; $i++) {
        echo $fId . &#39;:&#39; . $i;
        echo PHP_EOL;
        \Fiber::suspend();
    }
    unset($reg[$fId]);
});

$startTag = true;
while (count($reg) > 0) {
    if ($startTag) foreach ($reg as $pI) {
        $pI->start();
        $startTag = false;
    }
    foreach ($reg as $pI) {
        $pI->resume();
    }
}

Durch Nachrichtenbenachrichtigung abschließen

1:1
1:2
1:3
2:1
1:4
1:5
1:6
2:2
1:7
1:8
1:9
2:3
2:4
2:5
2:6
2:7
2:8
2:9

Das obige ist der detaillierte Inhalt vonPHP8.1 Fiber führt Cross-Multitasking aus (mit detaillierter Code-Erklärung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen