Gearman是一个分布式的任务分发处理系统。
但是它无法完成启动多线程的任务,所以在一台机器上只用Gearman无法实现并行,
即使new了很多GearmanWorker也是只有一个worker工作。
应该使用pcntl_fork()出一些子进程,在每个子进程中new一个GearmanWorker,
这样就可以实现并行处理了。
for ($i=0; $i < 10; $i++) {
if (($pid = pcntl_fork()) == 0) {
//子进程
$gmworker = new GearmanWorker();
$gmworker->addServer();
$gmworker->addFunction("sendmail", "sendmail_fn");
while($gmworker->work());
} else {
//主进程
}
}
while (1);
合理分配好任务数量和每个任务的工作量有助于提升处理速度。
还有一点很重要,GearmanClient::doBackgroud GearmanClient::addTaskBackgroud的区别,
可以参考 http://stackoverflow.com/questions/12689274/whats-the-difference-between-a-task-and-do
本文介绍了如何通过Gearman结合pcntl_fork()实现在同一台机器上的并行任务处理。由于Gearman本身不支持多线程启动,因此通过创建多个子进程,每个子进程运行一个GearmanWorker来达到并行效果。文章还提到了任务数量和工作负载的合理分配对于提高处理速度的重要性。
987

被折叠的 条评论
为什么被折叠?



