Heim  >  Artikel  >  Backend-Entwicklung  >  Vergleich zwischen Swoole-Coroutine und traditionellem FPM-Synchronisationsmodus

Vergleich zwischen Swoole-Coroutine und traditionellem FPM-Synchronisationsmodus

藏色散人
藏色散人nach vorne
2019-04-28 10:07:103555Durchsuche

Wenn Arrays die Essenz von PHP sind und Sie nicht mit Arrays spielen können, kann man nicht davon ausgehen, dass Sie PHP überhaupt verwenden können. Das Gleiche gilt für Coroutinen für Swoole. Wenn Sie Coroutinen nicht verstehen und Swoole nicht verwenden, verwenden Sie sie blind.

Vergleich zwischen Swoole-Coroutine und traditionellem FPM-Synchronisationsmodus

Erstens kann Swoole nur im Befehlszeilenmodus (Cli) ausgeführt werden, daher verwenden wir die Befehlszeile für Entwicklung und Debugging, nicht php-fpm/apache usw.

In Swoole können wir `SwooleCoroutine::create()` verwenden, um Coroutinen zu erstellen, oder Sie können auch die Abkürzung „go()“ verwenden.

Erste Einführung in die Swoole-Coroutine

go(function(){
    go(function(){
        echo 0, PHP_EOL;
    });
    echo 1, PHP_EOL;
});
go(function(){
    echo 2, PHP_EOL;
});
go(function(){
    echo 3, PHP_EOL;
});

Ausführungsergebnisse:

0
1
2
3

Vergleich zwischen Swoole-Coroutine und Synchronmodus

Wir haben immer gesagt, dass die Swoole-Coroutine für E/A-intensive Szenarien geeignet ist. Unter derselben Hardwarekonfigurationsumgebung bietet sie mehr Zugriff als der herkömmliche synchrone Modus.

Die uns bekannten Dateilese- und -schreib- und Netzwerkkommunikationsanfragen (MySQL, Redis, HTTP usw.) sind allesamt E/A-intensive Szenarien.

Angenommen, eine SQL-Abfrage dauert 100 ms. Im herkömmlichen Synchronisierungsmodus kann der aktuelle Prozess während dieser 100 ms keine anderen Vorgänge ausführen. Wenn Sie diese SQL zehnmal ausführen möchten, kann dies mehr als 1 Sekunde dauern.

Wenn Sie Coroutinen verwenden, plant die unterste Ebene die CPU, die Operationen anderer Coroutinen während der vorherigen Wartezeit von 100 ms auszuführen, obwohl verschiedene Coroutinen der Reihe nach ausgeführt werden. Mit anderen Worten: Die erste Abfrage hat möglicherweise keine Ergebnisse zurückgegeben und mehrere andere Abfragen wurden an MySQL gesendet und werden ausgeführt. Wenn zehn Coroutinen geöffnet sind und diese SQL separat ausgeführt wird, dauert der Abschluss möglicherweise nur 100+ms.

Der Testcode lautet wie folgt:

Swoole\Runtime::enableCoroutine(); // 开启一键协程化
 
function work()
{
    $pdo = new \PDO('mysql:host=127.0.0.1;dbname=db_test', 'root', 'root');
    $pdo->exec('select SLEEP(0.1)'); // 模拟sql需要执行 100ms 的情况
}
$time = microtime(true);
for($i = 0; $i < 10; ++$i)
{
    work();
}
echo &#39;time: &#39;, (microtime(true) - $time), &#39;s&#39;, PHP_EOL;
$time = microtime(true);
for($i = 0; $i < 10; ++$i)
{
    go(&#39;work&#39;);
}
swoole_event_wait(); // 等待所有协程执行完
echo &#39;time: &#39;, (microtime(true) - $time), &#39;s&#39;, PHP_EOL;

Ausführungsergebnis:

time: 1.0326268672943s
time: 0.10734605789185s

Der obige Code kann man sich als die Zeit vorstellen, die ein einzelner Prozess benötigt, um 10 Anfragen zu verarbeiten. Jede Anfrage erfordert die Ausführung einer SQL-Anweisung, die 100 ms dauert.

Synchronmodus, der etwa 1 Sekunde oder fpm dauert. Wie man sieht, kann während der Wartezeit von 100 ms nichts unternommen werden.

Das Coroutine-Modell, das etwa 0,1 s dauert, ist Swoole. Während der Wartezeit von 100 ms wird die aktuelle Coroutine angehalten und die zugrunde liegende Planung ermöglicht es der CPU, die Operationen anderer Coroutinen auszuführen.

Das obige ist der detaillierte Inhalt vonVergleich zwischen Swoole-Coroutine und traditionellem FPM-Synchronisationsmodus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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