swoole不是多線程的。因為php語言不支持多進程,所以swoole使用多進程模式,在多進程模式下存在進程內容隔離,在工作進程內修改global全局變量和超全局變量時,在其它進程是無效的。
本教程操作環境:Windows10系統、Swoole4版、DELL G3電腦
swoole是多線程嗎
由于PHP語言不支持多線程,因此Swoole使用多進程模式。在多進程模式下存在進程內存隔離,在工作進程內修改global全局變量和超全局變量時,在其他進程是無效的。
swoole的多線程其實就是多進程,進程創建太多切換的開銷很大,如果能用上pthreads建議用pthreads。
swoole實例如下:? ? ??
<?php /** * 創建多進程 */ $worker_num = 6; // 默認進程數 $workers = []; // 進程保存 $redirect_stdout = false; // 重定向輸出 ; 這個參數用途等會我們看效果 for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process('callback_function', $redirect_stdout); // 啟用消息隊列 int $msgkey = 0, int $mode = 2 $process->useQueue(0,?2); ????$pid?=?$process->start(); ? ????//?管道寫入內容 ????$process->write('index:'.$i); ? ????$process->push('進程的消息隊列內容'); ????//?將每一個進程的句柄存起來 ????$workers[$pid]?=?$process; } ? ? /** ?*?子進程回調 ?*?@param??swoole_process?$worker?[description] ?*?@return?[type]?????????????????[description] ?*/ function?callback_function(swoole_process?$worker) { ????$recv?=?$worker->pop(); ????echo?"子輸出主內容:?{$recv}".PHP_EOL; ????//get?guandao?content ????$recv?=?$worker->read(); ????$result?=?doTask(); ???? ????echo?PHP_EOL.$result.'==='.$worker->pid.'==='.$recv; ? ????$worker->exit(0); } ? ? /** ?*?監控/回收子進程 ?*/ while(1){ ????$ret?=?swoole_process::wait(); ????if?($ret){//?$ret?是個數組?code是進程退出狀態碼, ????????$pid?=?$ret['pid']; ????????echo?PHP_EOL."Worker?Exit,?PID="?.?$pid?.?PHP_EOL; ????}else{ ????????break; ????} } ? ? /** ?*?doTask ?*?@return?[type]?[description] ?*/ function?doTask() { ????sleep(2); ????return?true; }
推薦學習: swoole教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦