当前位置: 首页 > 后端技术 > PHP

php:多进程执行任务

时间:2023-03-29 13:42:26 PHP

需要并发执行指定数量的多个任务,并控制进程数Process&thread:进程之间相互独立,互不影响。代码示例:=$processNumLimit){echo"waitchlstart!\n";$exitid=pcntl_wait($status);//等待退出echo"waitchlend!extid:",$exitid,"\tstatus:",$status,"\n";}//任务总量控制if($task>=$taskNum){echo"taskNum够了!\n";休息;}}//进程号=0是新创建的进程else{//模拟不同任务的不同执行时长$sleep=rand(1,5);$currentProcessid=posix_getpid();//当前进程的Id$parentProcessid=posix_getppid();//父进程的ID$phpProcessid=getmypid();//当前php进程的IDecho"task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n";睡眠($睡眠);echo"task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n";退出(0);//子进程执行完退出,防止进入循环创建子进程}}执行结果:task:1processid:32225currentProcessid:32224parentProcessid:15053phpProcessid:32224task:0processid:0currentProcessid:32225parentProcessid:32224phpProcessid:32225sleep:5begin!task:2processid:32226currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:1processid:0currentProcessid:32226parentProcessid:32224phpProcessid:32226sleep:2begin!task:1processid:0currentProcessid:32226parentProcessid:32224phpProcessid:32226sleep:2end!waitchlend!extid:32226status:0task:3processid:32228currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:2processid:0currentProcessid:32228parentProcessid:32224phpProcessid:32228sleep:1begin!task:2processid:0currentProcessid:32228parentProcessid:32224phpProcessid:32228sleep:1end!waitchlend!extid:32228status:0task:4processid:32229currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:3processid:0currentProcessid:32229parentProcessid:32224phpProcessid:32229sleep:2begin!task:0processid:0currentProcessid:32225parentProcessid:32224phpProcessid:32225sleep:5end!waitchlend!extid:32225status:0task:5processid:32270currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:4processid:0currentProcessid:32270parentProcessid:32224phpProcessid:32270sleep:1begin!task:3processid:0currentProcessid:32229parentProcessid:32224phpProcessid:32229sleep:2end!waitchlend!extid:32229status:0task:6processid:32271currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:5processid:0currentProcessid:32271parentProcessid:32224phpProcessid:32271sleep:4begin!task:4processid:0currentProcessid:32270parentProcessid:32224phpProcessid:32270sleep:1end!waitchlend!extid:32270status:0task:7processid:32273currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:6processid:0currentProcessid:32273parentProcessid:32224phpProcessid:32273sleep:1begin!task:6processid:0currentProcessid:32273parentProcessid:32224phpProcessid:32273sleep:1end!waitchlend!extid:32273status:0task:8processid:32274currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!task:7processid:0currentProcessid:32274parentProcessid:32224phpProcessid:32274sleep:2begin!task:5processid:0currentProcessid:32271parentProcessid:32224phpProcessid:32271sleep:4end!task:7processid:0currentProcessid:32274parentProcessid:32224phpProcessid:32274sleep:2end!waitchlend!extid:32274status:0task:9processid:32277currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!waitchlend!extid:32271status:0task:8processid:0currentProcessid:32277parentProcessid:32224phpProcessid:32277sleep:2begin!task:10processid:32278currentProcessid:32224parentProcessid:15053phpProcessid:32224waitchlstart!任务:9processid:0currentProcessid:32278parentProcessid:32224phpProcessid:32278sleep:2begin!task:8processid:0currentProcessid:32277parentProcessid:32224phpProcessid:32277sleep:2end!task:9processid:2processid:2endrtask:9processid:2:32224phpProcessid:32278sleep:2end!waitchlend!extid:32277status:0taskNumenough执行分析:pcntl_fork创建子进程后,子进程执行函数代码,父进程继续递增taskid创建下一个task进程;使用pcntl_wait等待子进程执行完毕退出,然后再创建一个新的创建进程来控制进程总数;主流程创建后,通过break退出循环,可能还有子流程继续执行。相关函数:pcntl_fork在当前进程的当前位置产生一个分支(子进程)。成功时,在父进程的执行线程中返回生成的子进程的PID,在子进程的执行线程中返回0。失败时,在父进程上下文中返回-1,不创建子进程,并引发PHP错误。pcntl_wait等待或返回fork子进程的状态。等待函数暂停当前进程的执行,直到子进程退出或接收到中断当前进程或调用信号处理程序的信号。如果调用该函数时有子进程已经退出(俗称僵尸进程),则该函数立即返回。子进程使用的所有系统资源都将被释放。其他:1.僵尸进程和孤儿进程的问题部分僵尸进程被pcntl_wait获取并释放资源,未被接管的进程在主进程退出后成为孤儿进程。孤儿进程被init进程收养,完成wait的状态获取和资源释放。