如何限制进程数量?

4

在我的PHP网络应用程序中,我试图限制运行的CPU/内存密集型进程数量(例如,ImageMagick的“convert”命令)。我有许多cron作业执行各种脚本,这些脚本可能会执行太多这些CPU/内存密集型进程的实例。

为了限制这样的进程,我首先检查系统是否已经运行了一定数量的进程。以下是该函数:

function has_reached_process_limit($process, $limit)
{
    $command = 'ps -eo comm | grep ' . $process;
    exec($command, $output, $return);
    if (count($output) > $limit)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}   

所以,我运行类似这样的东西:

while (has_reached_process_limit('convert', 5) === TRUE)
{
   // loop over
}

问题在于,当我通过“top”命令监视我的操作系统资源时,我看到的进程数比我期望运行的要多得多。有任何想法吗?


你所指的“更多进程”是什么?可以举个例子吗? - codaddict
我认为这是因为ps也显示线程和fork。因此,如果其中一个imagemagick进程使用3个线程,它将显示3次。这可能是问题所在,但我不确定该如何解决。不过,老实说,最好采用下面的答案并使用工作队列。 - ryeguy
2个回答

2
我认为更好的方法是使用工作控制器或作业队列...但如果由于你的东西如此分离而无法实现,你的方法看起来也不错。但从这里我可以告诉你的PS命令应该总是返回"php",也许最好检查执行的文件或用户或其他什么东西?
你说的“LOT other processes”是指什么?PHP进程吗?它们是什么样子、执行什么任务?你也可以查看这个链接:http://www.php.net/manual/en/function.sem-get.php

0

对于这种用例,PHP有Semaphore扩展

resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )

http://www.php.net/manual/en/function.sem-get.php

我认为这可以满足您的需求,但信号量不是每天都用到的扩展,所以您可能需要通过在 PHP 中使用 --enable-sysvsem 开关来安装它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接