[TOC] ## 线程与进程的区别 * 多个线程是在同一个进程内的,线程之间可以共享内存变量而实现线程间的通信。 * 线程比进程更加轻量级,进程要比线程更加消耗系统资源。 > 多线程存在的问题主要有 * 线程读写变量存在着同步问题需要加锁 * 锁粒度过大会存在性能问题,会导致只有一个线程在运行,其它线程都在等待锁,也就无法实现并行。 * 同时使用多个锁时逻辑复杂,一旦某个锁没有被正确释放可能会发生线程死锁。 * 某个线程发生致命错误会导致整个进程崩溃 > 相对而言多进程更为稳定,可利用进程间通信`IPC`技术实现数据共享。多进程通信的方式主要包括 * 共享内存 共享内存和线程间读写变量时一样的,都需要加锁,同时也存在同步、死锁等问题。 * 消息队列 消息队列采用多个子进程抢占队列的模式,性能较好。 * 管道、UnixSock、TCP、UDP 可以使用`read/write`来传递数据,TCP/UDP使用socket来通信,子进程可以分布运行。 ## PHP 多进程案例 ~~~ public function actionTest() { $procNum = 150; // 150个进程 for($i = 0; $i < $procNum; $i++){ $PID = pcntl_fork(); //创建子进程 if ($PID == 0){ doFunc(); exit(); } elseif ($PID == -1) { die('could not fork'); } else { // 如果在这里写 pcntl_wait($status),则只有当前进程执行完毕后才会创建下一个进程 } } echo 'done'; } public function doFunc(){ echo 'haha'; } ~~~ ## 创建多进程的返回值 ~~~ public function actionTest3() { $nPID = pcntl_fork();//创建子进程 var_dump($nPID); } ~~~ > 返回值 ![](https://img.kancloud.cn/ac/b0/acb0ebdc0879d9749567b15911c9a067_565x58.png)