Rumah > Artikel > rangka kerja php > Swool dalam tindakan: Cara menggunakan coroutine untuk meningkatkan prestasi aplikasi
Swoole in action: Cara menggunakan coroutine untuk meningkatkan prestasi aplikasi
Apabila aplikasi Internet menjadi semakin kompleks, prestasi telah menjadi isu yang semakin penting. Sebagai rangka kerja komunikasi rangkaian berprestasi tinggi untuk coroutine, Swoole boleh menyelesaikan masalah ini dengan baik. Artikel ini akan memperkenalkan beberapa konsep asas coroutine Swoole dan mengambil contoh untuk menunjukkan cara menggunakan coroutine untuk meningkatkan prestasi aplikasi.
1 Apakah coroutine itu ialah benang ringan yang boleh mencapai kerjasama berbilang tugas pada satu utas dan boleh bertukar secara bebas antara coroutine. Dalam Swoole, coroutine boleh memudahkan kerumitan pengaturcaraan tak segerak Melalui coroutine, kita boleh menulis kod tak segerak sama seperti menulis kod segerak, meningkatkan kebolehbacaan dan kebolehselenggaraan kod. . coroutine. Kodnya adalah seperti berikut:
//创建协程 $cid = swoole_coroutine_create(function(){ echo "Hello Coroutine "; }); //若主线程不阻塞,则协程无法执行
Kod di atas boleh mengeluarkan "Hello Coroutine", menunjukkan bahawa coroutine telah berjaya dilaksanakan.
Dalam coroutine, anda juga boleh menggunakan fungsi swoole_coroutine_yield untuk melepaskan coroutine semasa dan membiarkan coroutine lain melaksanakan Kodnya adalah seperti berikut:
//创建协程 $cid = swoole_coroutine_create(function(){ echo "Hello Coroutine "; }); //等待协程执行 swoole_event_wait();
Dalam kod di atas, dua coroutine pertama dicipta, dan kemudian fungsi swoole_resume. digunakan untuk menggabungkan dua coroutine masing-masing menyambung semula pelaksanaan Oleh kerana fungsi swoole_coroutine_yield dipanggil dalam coroutine, coroutine akan mengeluarkan "Coroutine 1" dan "Coroutine 2" masing-masing, dan kemudian kedua-duanya menangguhkan pelaksanaan dan menyerahkan CPU. Akhir sekali, selepas coroutine melengkapkan kitaran, Dapatkan CPU dan output "Coroutine 1 resume" dan "Coroutine 2 resume" masing-masing.
3. Kemahiran biasa coroutine
Pengendalian tugas serentakDalam Swoole, fungsi swoole_coroutine_wait boleh digunakan untuk melaksanakan pelaksanaan serentak dan penyegerakan kod
di atas , tentukan terlebih dahulu Dua tugasan dibuat Sleep(1) ditambahkan pada fungsi pelaksanaan tugas untuk mensimulasikan masa pelaksanaan tugas Kemudian gelung foreach digunakan untuk mencipta dua coroutine, hasil pelaksanaan disimpan dalam tatasusunan $results. akhirnya fungsi swoole_coroutine_wait dipanggil untuk menunggu Coroutine selesai dan hasil pelaksanaan diperolehi.$cid1 = swoole_coroutine_create(function(){ echo "Coroutine 1 "; swoole_coroutine_yield(); echo "Coroutine 1 resume "; }); $cid2 = swoole_coroutine_create(function(){ echo "Coroutine 2 "; swoole_coroutine_yield(); echo "Coroutine 2 resume "; }); swoole_coroutine_resume($cid1); swoole_coroutine_resume($cid2); swoole_event_wait();kod di atas digunakan dalam kod laksana di atas. perintah sistem secara tidak segerak dan hasil digunakan untuk membaca langkah demi langkah Dapatkan hasil output dan akhirnya keluarkan masa apabila arahan itu dilaksanakan. Teknologi kolam sambungan
$tasks = [ "task1" => function () { sleep(1); return "Task 1 Done "; }, "task2" => function () { sleep(1); return "Task 2 Done "; }, ]; $results = []; foreach ($tasks as $name => $task) { $cid = swoole_coroutine_create(function () use ($name, $task, &$results) { $result = $task(); $results[$name] = $result; }); swoole_coroutine_resume($cid); } swoole_coroutine_wait(); print_r($results);
Dalam kod di atas, mula-mula buat kumpulan sambungan, gunakan gelung for untuk mencipta 10 sambungan MySQL dan sertai kumpulan sambungan, kemudian gunakan fungsi go untuk mencipta coroutine, dan keluarkan sambungan daripada kumpulan sambungan untuk melaksanakan operasi pertanyaan pangkalan data , dan akhirnya meletakkan sambungan semula ke dalam kumpulan sambungan. Kelebihan kumpulan sambungan ialah ia boleh mengurangkan overhed yang disebabkan oleh penciptaan dan pemusnahan sambungan dan meningkatkan prestasi operasi pangkalan data.
4. Contoh penggunaan Swoole untuk meningkatkan prestasi aplikasi perkhidmatan mikro
Pertama, kami mencipta program perkhidmatan mikro ringkas dengan kod berikut:
function async_exec($cmd) { $fp = popen($cmd, "r"); if ($fp) { while (!feof($fp)) { yield fread($fp, 8192); } pclose($fp); } } $s = microtime(true); $coroutine = async_exec('ls /'); foreach ($coroutine as $stdout) { echo $stdout; } $e = microtime(true); echo "Time used: " . ($e - $s) . "s ";
Program di atas ialah program simulasi perkhidmatan mikro ringkas yang menyediakan dua perkhidmatan: perkhidmatan1 dan perkhidmatan2. Perkhidmatan 1 akan memanggil Perkhidmatan 2 dan menukar hasil pulangan ke dalam format huruf besar Perkhidmatan 2 akan menyulitkan rentetan input dengan MD5 dan mengembalikannya.
Gunakan Swoole untuk melaksanakan versi coroutine microservices$pool = new SwooleCoroutineChannel(10); for ($i = 0; $i < 10; $i++) { $conn = new SwooleCoroutineMySQL(); $conn->connect([ 'host' => '127.0.0.1', 'user' => 'root', 'password' => '123456', 'database' => 'test', ]); $pool->push($conn); } go(function () use ($pool) { $conn = $pool->pop(); $result = $conn->query('select * from users'); //... $pool->push($conn); });
Dalam kod di atas, Swoole digunakan untuk menyediakan perkhidmatan mikro HTTP. ke URI yang diminta dan hubungi perkhidmatan yang sepadan. Dalam pemprosesan perkhidmatan 1, perkhidmatan perkhidmatan 2 dipanggil dan hasilnya dikembalikan, tetapi kaedah panggilan tidak segerak melalui fungsi go, dan kata kunci await digunakan untuk menunggu hasil panggilan tak segerak. Dalam setiap pelaksanaan perkhidmatan mikro, operasi IO tak segerak digunakan untuk mensimulasikan IO rangkaian sebenar untuk lebih mencerminkan ciri-ciri coroutine Swoole.
Ringkasan
Atas ialah kandungan terperinci Swool dalam tindakan: Cara menggunakan coroutine untuk meningkatkan prestasi aplikasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!