pbergman/fork

2.0.2 2015-05-28 21:20 UTC

This package is auto-updated.

Last update: 2024-08-29 12:42:14 UTC


README

这是一个用于将工作调度到工作者(子进程)的小型包装器,它使用 opis/closure 来序列化闭包,并使用 redis(订阅/发布和列表方法)来分发工作。这与旧版本的工作方式略有不同,因为这一次将fork子进程并发送工作给它们,而不是为每个工作fork新的子进程。

###使用方法

require 'vendor/autoload.php';

$m = new \PBergman\Fork\Manager();

$m->setWorkers(10);

for ($i = 0; $i < 25; $i++) {
    $foo = rand(1,8);
    $m->addJob(function($redis, $logger) use ($foo) {
        $logger->info('sleeping ' . $foo);
        sleep($foo);
    });
}

$m->run();

将输出类似的内容

[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10665 [1/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10666 [2/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10667 [3/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10668 [4/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10669 [5/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10670 [6/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10671 [7/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10672 [8/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10673 [9/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Child spawned 10674 [10/10]  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10665  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10666  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10667  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10668  
[2015-05-27 18:16:52] [10666] manager.INFO: sleeping 6  
[2015-05-27 18:16:52] [10663] manager.DEBUG: Pushing job to queue ##MANAGER@10669  
[2015-05-27 18:16:52] [10665] manager.INFO: sleeping 8  
[2015-05-27 18:16:52] [10667] manager.INFO: sleeping 5  
[2015-05-27 18:16:52] [10668] manager.INFO: sleeping 1  

...........

[2015-05-27 18:17:07] [10663] manager.DEBUG: Child 10672 exited with code 0  
[2015-05-27 18:17:07] [10671] manager.DEBUG: Job finished  
[2015-05-27 18:17:07] [10671] manager.DEBUG: Cleaning up resources  
[2015-05-27 18:17:07] [10663] manager.DEBUG: Pushing exit signal to ##MANAGER@10671  
[2015-05-27 18:17:07] [10671] manager.DEBUG: Received exit signal, shutting down  
[2015-05-27 18:17:09] [10674] manager.DEBUG: Job finished  
[2015-05-27 18:17:09] [10674] manager.DEBUG: Cleaning up resources  
[2015-05-27 18:17:09] [10663] manager.DEBUG: Pushing exit signal to ##MANAGER@10674  
[2015-05-27 18:17:09] [10663] manager.DEBUG: Child 10669 exited with code 0  
[2015-05-27 18:17:09] [10674] manager.DEBUG: Received exit signal, shutting down  
[2015-05-27 18:17:09] [10663] manager.DEBUG: Child 10671 exited with code 0  
[2015-05-27 18:17:09] [10663] manager.DEBUG: Child 10674 exited with code 0  

 

###方法

##__construct(<PBergman\Fork\Helper\Redis> $redis = null, <Psr\Log\LoggerInterface> $logger = null)

构造函数

##run()

将开始向子进程调度工作,直到所有工作完成为止,是阻塞的

##setWorkers( $workers)

设置要启动的工作者数量,如果有更多工作者,则将缩小到工作的大小

##setTimeoutIdle( $timeout_idle)

设置子进程空闲运行的时间超时(等待新工作)

##setGenerator(<PBergman\Fork\Generator\GeneratorInterface> $generator)

设置生成器,用于将数据转换为通过 redis 消息队列发送的数据

##addJob( $job)

向子进程添加工作,应该是可调用的,可以是闭包或实现了 __invoke() 的类