Heim  >  Artikel  >  PHP-Framework  >  Werden in Swoole Coroutinen verwendet?

Werden in Swoole Coroutinen verwendet?

WBOY
WBOYOriginal
2022-06-16 17:29:572533Durchsuche

Coroutinen werden hauptsächlich verwendet, um konkurrierende Ressourcen in Threads in kollaborative Operationen umzuwandeln. Coroutinen können jedoch nicht von Multi-Core-CPUs profitieren . Wird zur Bearbeitung von E/A-intensiven Aufgaben, Diensten mit hoher Parallelität usw. verwendet.

Werden in Swoole Coroutinen verwendet?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, Swoole 4-Version, DELL G3-Computer

Werden Coroutinen in Swoole verwendet?

Was sind Coroutinen? Der Prozess kann einfach als Thread verstanden werden, aber dieser Thread befindet sich im Benutzermodus und erfordert keine Beteiligung des Betriebssystems. Im Gegensatz zu Threads können Coroutinen die Vorteile von Multicore nicht nutzen CPUs: Wenn Sie die Vorteile von Multi-Core-CPUs nutzen möchten, müssen Sie sich auf das Multiprozessmodell von Swoole verlassen.

Funktionen von Coroutinen

Entwickler können synchrones Codeschreiben verwenden, um die Wirkung und Leistung asynchroner E/A ohne jegliches Bewusstsein zu erzielen und so die durch herkömmliche asynchrone Rückrufe verursachte diskrete Codelogik und den durch das Fallen in mehrschichtige Rückrufe verursachten Code zu vermeiden zu pflegen.

Da gleichzeitig die unterste Ebene die Coroutine kapselt, müssen Entwickler im Vergleich zum herkömmlichen Coroutine-Framework der PHP-Ebene nicht das Schlüsselwort yield verwenden, um eine Coroutine-E/A-Operation zu identifizieren, sodass kein In- Tiefes Verständnis der Semantik von Yield und jedem. Alle Aufrufe der ersten Ebene werden in Yield geändert, was die Entwicklungseffizienz erheblich verbessert. Coroutinen eignen sich für E/A-intensive Anwendungen, da Coroutinen automatisch geplant werden, wenn E/A blockiert wird, wodurch der durch E/A-Blockierung verursachte Zeitverlust reduziert wird.

10.000 Mal schlafen, 10.000 Mal Dateien lesen, schreiben, überprüfen und löschen, 10.000 Mal mit PDO und MySQLi mit der Datenbank kommunizieren, 10.000 Mal einen TCP-Server erstellen und mehrere Clients miteinander kommunizieren, einen UDP-Server und mehrere Clients erstellen 10.000 Mal miteinander kommunizieren... alles wird perfekt in einem Vorgang innerhalb einer Sekunde erledigt!

Anwendbare Szenarien

Dienste mit hoher Parallelität, wie Flash-Sale-System, Hochleistungs-API-Schnittstelle, RPC-Server, Verbindungspool, IM-Chat, Spieleserver, Internet der Dinge, Nachrichtenserver usw.

Beispiel 1:

Benutzer können über die Go-Funktion eine Coroutine erstellen, um eine gleichzeitige Ausführung zu erreichen, wie im folgenden Code gezeigt:

go(function () {
    echo "one" . PHP_EOL;
});
go(function () {
    echo "two" . PHP_EOL;
});
go(function () {
    echo "three" . PHP_EOL;
});

Immer wenn ein Go erscheint, erstellt die unterste Ebene automatisch eine Coroutine Der Inhalt wird ausgegeben und dann automatisch beendet implementiert die gleichzeitige Ausführung von Anforderungen:

go(function () {
    // 协程 MySQL 客户端
    $mysql = new Swoole\Coroutine\MySQL();
    $mysql->connect([
        'host' => '172.17.0.1',
        'user' => 'root',
        'password' => 'root',
        'database' => 'swoole',
    ]);
    $mysql->setDefer();
    $mysql->query('select sleep(2);');
    
     print_r("time1: " . time() . PHP_EOL);
    
    // 协程 Redis 客户端
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect('172.17.0.1', 6379);
    $redis->setDefer();
    $redis->set('name', '张三');
    $redis->recv();
    
    print_r("time2: " . time() . PHP_EOL);
    $redis->setDefer();
    $redis->get('name');
    $res1 = $mysql->recv();
    $res2 = $redis->recv();
    print_r(['result1: ' => $res1[0]['sleep'], 'result2: ' => $res2, 'time3: ' => time()]);
});
Am Beispiel des obigen Codes kann einfach verstanden werden, dass im Verzögerungsmodus die Anforderungsantworten mehrerer Clients gleichzeitig erfolgen. Nach dem Festlegen von setDefer (true) wird eine Anforderung über Redis initiiert oder MySQL-Client, wartet nicht mehr darauf, dass der Server das Ergebnis zurückgibt, sondern gibt sofort nach dem Senden der Anfrage „true“ zurück. Danach können Sie weitere Redis- und MySQL-Anfragen initiieren und schließlich die recv()-Methode verwenden, um den Antwortinhalt zu empfangen.

Hinweise

Wenn derselbe Coroutine-Client von mehreren Coroutinen gemeinsam genutzt wird, ist das Synchronisationsblockierungsprogramm unterschiedlich. Die Coroutine verarbeitet Anfragen gleichzeitig, sodass möglicherweise viele Anfragen gleichzeitig verarbeitet werden führt zu Datenverwirrung zwischen verschiedenen Coroutinen. Coroutinen synchronisieren die ursprüngliche asynchrone Logik, der Wechsel der Coroutinen erfolgt jedoch implizit, sodass die Konsistenz globaler Variablen und statischer Variablen vor und nach dem Wechsel der Coroutinen nicht garantiert werden kann.

Empfohlenes Lernen:

Swoole-Tutorial

Das obige ist der detaillierte Inhalt vonWerden in Swoole Coroutinen verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn