2014-04-07 89 views
1

我需要一個PHP中的並行任務運行器(最有可能在windows - IIS7 fastcgi上),它有一個完整的實現隱藏。它的界面應該是這樣的:PHP - 並行任務運行器

$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代碼的並行技術 - 並行線程,PCNTL,EXEC,Gearman的,捲曲多,等...

我需要回答的問題:

  • 是否有可能使這個實現與任何這些技術在隱瞞什麼?如何做到這一點(如果在實現細節中有一些先進的解決方法)?有沒有圖書館有這個功能?
  • 如何提取有關並行任務運行的信息?例如:task1: { a(); b(); },task2: { c(); },我怎麼能知道這些函數的調用順序是a(); b(); c();a(); c(); b();c(); a(); b();
  • 如果出現問題,我該如何調試我的任務?

更新

我查了許多可能的解決方案,我結束了並行線程。使用線程比進程更容易......唯一的缺點是它不支持xdebug。

回答

3

承諾PHP中的並行線程

東西我寫的,但沒有時間談...

承諾是美味,它們使一些通常相當複雜的到的東西很簡單。

當我們談論Javascript時,每個人都明白堆棧的概念;這就是動畫以及我們在網絡上做的其他許多花哨的東西是如何運行的。

實際上,我爲pthreads編寫承諾的努力是嘗試使線程簡單到每個人都能理解的Javascript堆棧。

它只是恰巧,這事適合您的需求幾乎是完美的:

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

$manager->shutdown(); 

你必須使用對象,而不是關閉(Zend的限制),但它的承諾模式,它是完全異步和管理。

這是PHP的,所以可以用作曲安裝...如果你喜歡那種事情......

https://github.com/krakjoe/promises

+0

有沒有以某種方式共享變量之間的(東西非序列化)的方式任務? – inf3rno

+0

您可以看到AddTwo和PrintMeaning類都接受原始承諾對象並使用它的成員。 –