swoole的多線程其實(shí)就是多進(jìn)程,進(jìn)程創(chuàng)建太多切換的開銷很大,如果能用上pthreads建議用pthreads。
swoole實(shí)例如下: ? ? ? (推薦學(xué)習(xí): swoole視頻教程)
<?php /** * 創(chuàng)建多進(jìn)程 */ $worker_num = 6; // 默認(rèn)進(jìn)程數(shù) $workers = []; // 進(jìn)程保存 $redirect_stdout = false; // 重定向輸出 ; 這個(gè)參數(shù)用途等會(huì)我們看效果 for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process('callback_function', $redirect_stdout); // 啟用消息隊(duì)列 int $msgkey = 0, int $mode = 2 $process->useQueue(0,?2); ????$pid?=?$process->start(); ? ????//?管道寫入內(nèi)容 ????$process->write('index:'.$i); ? ????$process->push('進(jìn)程的消息隊(duì)列內(nèi)容'); ????//?將每一個(gè)進(jìn)程的句柄存起來 ????$workers[$pid]?=?$process; } ? ? /** ?*?子進(jìn)程回調(diào) ?*?@param??swoole_process?$worker?[description] ?*?@return?[type]?????????????????[description] ?*/ function?callback_function(swoole_process?$worker) { ????$recv?=?$worker->pop(); ????echo?"子輸出主內(nèi)容:?{$recv}".PHP_EOL; ????//get?guandao?content ????$recv?=?$worker->read(); ????$result?=?doTask(); ???? ????echo?PHP_EOL.$result.'==='.$worker->pid.'==='.$recv; ? ????$worker->exit(0); } ? ? /** ?*?監(jiān)控/回收子進(jìn)程 ?*/ while(1){ ????$ret?=?swoole_process::wait(); ????if?($ret){//?$ret?是個(gè)數(shù)組?code是進(jìn)程退出狀態(tài)碼, ????????$pid?=?$ret['pid']; ????????echo?PHP_EOL."Worker?Exit,?PID="?.?$pid?.?PHP_EOL; ????}else{ ????????break; ????} } ? ? /** ?*?doTask ?*?@return?[type]?[description] ?*/ function?doTask() { ????sleep(2); ????return?true; }
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END