今天小編給大家分享一下swoole協(xié)程的執(zhí)行流程是什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
創(chuàng)新互聯(lián)是一家專業(yè)從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!
在swoole中,Swoole server接收數(shù)據(jù)在worker進(jìn)程觸發(fā)onReceive回調(diào),產(chǎn)生一個(gè)協(xié)程,Swoole為每個(gè)請(qǐng)求創(chuàng)建對(duì)應(yīng)攜程,協(xié)程中也能創(chuàng)建子協(xié)程,協(xié)程在底層實(shí)現(xiàn)上是單線程的,因此同一時(shí)間只有一個(gè)協(xié)程在工作。
本教程操作環(huán)境:Windows10系統(tǒng)、Swoole4版、DELL G3電腦
什么是進(jìn)程?
進(jìn)程就是應(yīng)用程序的啟動(dòng)實(shí)例。獨(dú)立的文件資源,數(shù)據(jù)資源,內(nèi)存空間。
什么是線程?
線程屬于進(jìn)程,是程序的執(zhí)行者。一個(gè)進(jìn)程至少包含一個(gè)主線程,也可以有更多的子線程。線程有兩種調(diào)度策略,一是:分時(shí)調(diào)度,二是:搶占式調(diào)度。
什么是協(xié)程?
協(xié)程是輕量級(jí)線程,協(xié)程也是屬于線程,協(xié)程是在線程里執(zhí)行的。協(xié)程的調(diào)度是用戶手動(dòng)切換的,所以又叫用戶空間線程。協(xié)程的創(chuàng)建、切換、掛起、銷毀全部為內(nèi)存操作,消耗是非常低的。協(xié)程的調(diào)度策略是:協(xié)作式調(diào)度。
Swoole 協(xié)程的原理
Swoole4 由于是單線程多進(jìn)程的,同一時(shí)間同一個(gè)進(jìn)程只會(huì)有一個(gè)協(xié)程在運(yùn)行。
Swoole server 接收數(shù)據(jù)在 worker 進(jìn)程觸發(fā) onReceive 回調(diào),產(chǎn)生一個(gè)攜程。Swoole 為每個(gè)請(qǐng)求創(chuàng)建對(duì)應(yīng)攜程。協(xié)程中也能創(chuàng)建子協(xié)程。
協(xié)程在底層實(shí)現(xiàn)上是單線程的,因此同一時(shí)間只有一個(gè)協(xié)程在工作,協(xié)程的執(zhí)行是串行的。
因此多任務(wù)多協(xié)程執(zhí)行時(shí),一個(gè)協(xié)程正在運(yùn)行時(shí),其他協(xié)程會(huì)停止工作。當(dāng)前協(xié)程執(zhí)行阻塞 IO 操作時(shí)會(huì)掛起,底層調(diào)度器會(huì)進(jìn)入事件循環(huán)。當(dāng)有 IO 完成事件時(shí),底層調(diào)度器恢復(fù)事件對(duì)應(yīng)的協(xié)程的執(zhí)行。。所以協(xié)程不存在 IO 耗時(shí),非常適合高并發(fā) IO 場(chǎng)景。
Swoole 的協(xié)程執(zhí)行流程
協(xié)程沒(méi)有 IO 等待 正常執(zhí)行 PHP 代碼,不會(huì)產(chǎn)生執(zhí)行流程切換
協(xié)程遇到 IO 等待 立即將控制權(quán)切,待 IO 完成后,重新將執(zhí)行流切回原來(lái)協(xié)程切出的點(diǎn)
協(xié)程并行協(xié)程依次執(zhí)行,同上一個(gè)邏輯
協(xié)程嵌套執(zhí)行流程由外向內(nèi)逐層進(jìn)入,直到發(fā)生 IO,然后切到外層協(xié)程,父協(xié)程不會(huì)等待子協(xié)程結(jié)束
協(xié)程的執(zhí)行順序
先來(lái)看看基礎(chǔ)的例子:
go(function () { echo "hello go1 \n";});echo "hello main \n";go(function () { echo "hello go2 \n";});
go() 是 \Co::create() 的縮寫, 用來(lái)創(chuàng)建一個(gè)協(xié)程, 接受 callback 作為參數(shù), callback 中的代碼, 會(huì)在這個(gè)新建的協(xié)程中執(zhí)行.
備注: \Swoole\Coroutine 可以簡(jiǎn)寫為 \Co
上面的代碼執(zhí)行結(jié)果:
root@b98940b00a9b /v/w/c/p/swoole# php co.phphello go1 hello main hello go2
執(zhí)行結(jié)果和我們平時(shí)寫代碼的順序, 好像沒(méi)啥區(qū)別. 實(shí)際執(zhí)行過(guò)程:
運(yùn)行此段代碼, 系統(tǒng)啟動(dòng)一個(gè)新進(jìn)程
遇到 go(), 當(dāng)前進(jìn)程中生成一個(gè)協(xié)程, 協(xié)程中輸出 heelo go1, 協(xié)程退出
進(jìn)程繼續(xù)向下執(zhí)行代碼, 輸出 hello main
再生成一個(gè)協(xié)程, 協(xié)程中輸出heelo go2, 協(xié)程退出
運(yùn)行此段代碼, 系統(tǒng)啟動(dòng)一個(gè)新進(jìn)程. 如果不理解這句話, 你可以使用如下代碼:
// co.php執(zhí)行并使用 ps aux 查看系統(tǒng)中的進(jìn)程:
root@b98940b00a9b /v/w/c/p/swoole# php co.php &? root@b98940b00a9b /v/w/c/p/swoole# ps auxPID USER TIME COMMAND 1 root 0:00 php -a 10 root 0:00 sh 19 root 0:01 fish 749 root 0:00 php co.php 760 root 0:00 ps aux我們來(lái)稍微改一改, 體驗(yàn)協(xié)程的調(diào)度:
use Co;go(function () { Co::sleep(1); // 只新增了一行代碼 echo "hello go1 \n";});echo "hello main \n";go(function () { echo "hello go2 \n";}); \Co::sleep() 函數(shù)功能和 sleep() 差不多, 但是它模擬的是 IO等待(IO后面會(huì)細(xì)講). 執(zhí)行的結(jié)果如下: root@b98940b00a9b /v/w/c/p/swoole# php co.phphello main hello go2 hello go1怎么不是順序執(zhí)行的呢? 實(shí)際執(zhí)行過(guò)程:
運(yùn)行此段代碼, 系統(tǒng)啟動(dòng)一個(gè)新進(jìn)程
遇到 go(), 當(dāng)前進(jìn)程中生成一個(gè)協(xié)程
協(xié)程中遇到 IO阻塞 (這里是 Co::sleep() 模擬出的 IO等待), 協(xié)程讓出控制, 進(jìn)入?yún)f(xié)程調(diào)度隊(duì)列
進(jìn)程繼續(xù)向下執(zhí)行, 輸出 hello main
執(zhí)行下一個(gè)協(xié)程, 輸出 hello go2
之前的協(xié)程準(zhǔn)備就緒, 繼續(xù)執(zhí)行, 輸出 hello go1
到這里, 已經(jīng)可以看到 swoole 中 協(xié)程與進(jìn)程的關(guān)系, 以及 協(xié)程的調(diào)度, 我們?cè)俑囊桓膭偛诺某绦?
go(function () { Co::sleep(1); echo "hello go1 \n";});echo "hello main \n";go(function () { Co::sleep(1); echo "hello go2 \n";});
我想你已經(jīng)知道輸出是什么樣子了:
root@b98940b00a9b /v/w/c/p/swoole# php co.phphello main hello go1 hello go2
以上就是“swoole協(xié)程的執(zhí)行流程是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。