4

我有一个通过 Unix 套接字与 PHP 通信的 C 程序。程序如下: PHP 接受用户上传的文件,然后向 C 发送一个“信号”,然后 C 调度另一个进程(fork)来解压缩文件(我知道这可以由 PHP 单独处理,这只是一个示例;整个问题更复杂)。

问题是我不想同时运行超过 4 个进程。我认为这可以这样解决:C,当它从 PHP 获得一个新的“任务”时,它会将它转储到一个队列中并一个接一个地处理它们(确保运行不超过 4 个),同时仍在监听插座。

我不确定如何实现这一点,因为我不能在同一个过程中做到这一点(或者我可以)?我以为我可以有另一个子进程来管理队列,父进程可以使用共享内存访问该队列,但这似乎过于复杂。还有其他方法吗?

提前致谢。

4

1 回答 1

1

如果您需要为每个任务处理程序设置一个单独的进程,那么您可以考虑设置五个单独的进程。第一个是侦听器,处理新传入的任务,并将其放入队列中。每个任务处理程序最初都会发送工作请求,并且在完成任务处理时也会发送。当侦听器收到此请求时,它将队列中的下一个任务传递给任务处理程序,或者如果任务队列为空,则将任务处理程序放在处理程序队列中。当任务队列从空转换为非空时,它会检查处理程序队列中是否有就绪的任务处理程序。如果是这样,它将该任务处理程序从队列中取出,并将任务从任务队列传递到任务处理程序。

PHP 进程会将任务交给侦听器,而任务处理程序将从侦听器获取任务。侦听器只是等待 put 或 get 请求,然后处理它们。您可以将侦听器视为一个简单的 Web 服务器,但是到 PHP 进程和每个任务处理程序的每个套接字连接都可以是持久的。

由于套接字的数量很小且持久,因此任何多路复用调用都可以工作(select, poll, epoll,kqueue或任何对您的系统最好和/或可用的方法),但使用单独的线程同步处理每个套接字可能是最简单的。就绪任务处理程序队列将是任务队列上的信号量或条件变量。处理来自 PHP 进程的 put 的线程会将任务放置在任务队列中,并向上传递信号量。每个处理就绪任务的线程都会关闭信号量,然后从任务队列中取出一个任务。任务队列本身可能需要互斥保护,具体取决于它的实现方式。

于 2013-07-10T06:00:22.490 回答