swoole協(xié)程和異步區(qū)別

swoole協(xié)程和異步區(qū)別

從4.0版本開始swoole提供了完整的協(xié)程(Coroutine)+ 通道(channel)特性,帶來全新的CSP編程模型。

應(yīng)用層可使用完全同步的編程方式,底層自動實現(xiàn)異步IO。? ? ? ? ? ? ? ? ? ? (推薦學(xué)習(xí): swoole視頻教程

go(function?()?{ ????$redis?=?new?SwooleCoroutineRedis(); ????$redis->connect('127.0.0.1',?6379); ????$val?=?$redis->get('key'); });

4.0.0或更高版本僅支持php7

4.0.1版本開始去除了–enable-coroutine編譯選項,改為動態(tài)配置

協(xié)程可以理解為純用戶態(tài)的線程,其通過協(xié)作而不是搶占來進(jìn)行切換。相對于進(jìn)程或者線程,協(xié)程所有的操作都可以在用戶態(tài)完成,創(chuàng)建和切換的消耗更低。

Swoole可以為每一個請求創(chuàng)建對應(yīng)的協(xié)程,根據(jù)IO的狀態(tài)來合理的調(diào)度協(xié)程,這會帶來了以下優(yōu)勢:

開發(fā)者可以無感知的用同步的代碼編寫方式達(dá)到異步IO的效果和性能,避免了傳統(tǒng)異步回調(diào)所帶來的離散的代碼邏輯和陷入多層回調(diào)中導(dǎo)致代碼無法維護(hù)

同時由于底層封裝了協(xié)程,所以對比傳統(tǒng)的PHP層協(xié)程框架,開發(fā)者不需要使用yield關(guān)鍵詞來標(biāo)識一個協(xié)程IO操作,所以不再需要對yield的語義進(jìn)行深入理解以及對每一級的調(diào)用都修改為yield,這極大的提高了開發(fā)效率

可以滿足大部分開發(fā)者的需求。對于私有協(xié)議,開發(fā)者可以使用協(xié)程的TCP或者udp接口去方便的封裝。

在Server程序中如果需要執(zhí)行很耗時的操作,比如一個聊天服務(wù)器發(fā)送廣播,Web服務(wù)器中發(fā)送郵件。如果直接去執(zhí)行這些函數(shù)就會阻塞當(dāng)前進(jìn)程,導(dǎo)致服務(wù)器響應(yīng)變慢。

Swoole提供了異步任務(wù)處理的功能,可以投遞一個異步任務(wù)到TaskWorker進(jìn)程池中執(zhí)行,不影響當(dāng)前請求的處理速度。

程序代碼

基于第一個TCP服務(wù)器,只需要增加onTask和onFinish2個事件回調(diào)函數(shù)即可。另外需要設(shè)置task進(jìn)程數(shù)量,可以根據(jù)任務(wù)的耗時和任務(wù)量配置適量的task進(jìn)程。

$serv?=?new?swoole_server("127.0.0.1",?9501);  //設(shè)置異步任務(wù)的工作進(jìn)程數(shù)量 $serv->set(array('task_worker_num'?=>?4));  $serv->on('receive',?function($serv,?$fd,?$from_id,?$data)?{ ????//投遞異步任務(wù) ????$task_id?=?$serv->task($data); ????echo?"Dispath?AsyncTask:?id=$task_idn"; });  //處理異步任務(wù) $serv->on('task',?function?($serv,?$task_id,?$from_id,?$data)?{ ????echo?"New?AsyncTask[id=$task_id]".PHP_EOL; ????//返回任務(wù)執(zhí)行的結(jié)果 ????$serv->finish("$data?->?OK"); });  //處理異步任務(wù)的結(jié)果 $serv->on('finish',?function?($serv,?$task_id,?$data)?{ ????echo?"AsyncTask[$task_id]?Finish:?$data".PHP_EOL; });  $serv->start();

調(diào)用$serv->task()后,程序立即返回,繼續(xù)向下執(zhí)行代碼。onTask回調(diào)函數(shù)Task進(jìn)程池內(nèi)被異步執(zhí)行。執(zhí)行完成后調(diào)用$serv->finish()返回結(jié)果。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊9 分享