PHP - 并行任务运行器

时间:2014-04-07 18:23:02

标签: php parallel-processing

我需要PHP中的并行任务运行器(最有可能在Windows上 - IIS7 fastcgi),它具有完整的隐藏实现。它的界面应该是这样的:

$taskRunner = new ParallelTaskRunner();
$taskRunner->add(function () use ($sharedResource){
    //task 1
});
$taskRunner->add(function () use ($sharedResource){
    //task 2
});
$taskRunner->run(); //runs task 1, task 2 parallel

我做了一些研究:我知道可以运行PHP代码并行的技术 - pthreads,pcntl,exec,gearman,curl multi等...

我需要回答的问题:

  • 是否可以使用这些技术隐藏此实现?如何做到这一点(如果在实现细节中有一些高级解决方法)?有没有这个功能的图书馆?
  • 如何提取有关并行任务运行的信息?例如:task1: { a(); b(); }task2: { c(); },我怎么知道函数的调用顺序是a(); b(); c();a(); c(); b();c(); a(); b();
  • 如果出现问题,如何调试我的任务?

更新

我检查了很多可能的解决方案,最后我得到了pthreads。使用线程比使用进程要容易得多......唯一的缺点就是它不支持xdebug。

1 个答案:

答案 0 :(得分:3)

PHP中使用pthreads 的

Promise

我写的东西,但没时间谈论......

承诺很美味,他们把一些通常相当复杂的东西变成非常简单的东西。

当我们谈论Javascript时,每个人都理解堆栈的概念;这就是动画以及我们在网上做的许多其他花哨的东西的运行方式。

实际上,我为pthreads编写promises的努力是尝试使线程像Javascript堆栈一样简单,每个人都理解。

恰好这种情况几乎完全符合您的需求:

$manager = new PromiseManager();
$promise = 
    new Promise($manager, new CalculateTheMeaningOfLife());
$promise
    ->then(
        new AddTwo($promise))
    ->then(
        new PrintMeaning($promise));

$manager->shutdown();

你必须使用对象而不是闭包(Zend的限制),但它是promises模式,它是完全异步和管理的。

这是PHP,所以可以和作曲家一起安装......如果你喜欢那种东西......

https://github.com/krakjoe/promises