2013-02-20 55 views
0

當所有工人都在工作時是否可以讓客戶端空閒?PHP Gearman - 當沒有工人時空閒

我有以下情況:

$client= new GearmanClient(); 
$client->addServer(); 

$data = array(thousands of entries); 

foreach($data as $dt) { 
    $client->doBackground('doFancy', $dt); 
} 

當我運行它,它會使成千上萬的隊列,甚至超負荷的內存。

是否有可能等到工人變得自由,直到foreach循環繼續分配新的工作?

+0

這似乎違背了使用隊列的整個點。你發送的每個任務有多大?你能否將它們打包成更大的塊來減少你請求的任務量? – 2013-02-20 19:07:18

+0

@ Louis-PhilippeHuberdeau每個任務都會運行aprox。 10秒,但是當它像現在這樣做時,我會推動30萬個任務。 – Aley 2013-02-20 19:16:15

+0

如果處理信息的php腳本可以處理信息的大小,我很難相信Gearman守護進程不會處理它。它比一個php腳本更加健壯。 – Aurimas 2013-02-20 22:35:42

回答

0

您可以爲隊列大小創建計數器併爲完整事件設置回調。在這個回調中,你必須遞減計數器並檢查計數器,如果它的值小於N - 將增加新的一堆任務並計數器遞增。

+0

如果我正確地做到了,後臺工作人員必須向客戶端發回一個回調。這可能嗎?你可以寫一個小例子(只是僞代碼左右)?我非常感謝。 – Aley 2013-02-24 16:17:37

+1

工人代碼:'$工人─>調用addFunction( 'MYFUNC', '處理');' 而在處理函數: '功能處理器(GearmanJob $工作){ \t $求職> sendComplete('任何完整信息'); }' 此外,在客戶端: '函數在completeHandler(GearmanTask $任務){...} $客戶 - > setCompleteCallback( 'completeHandler');' – 2013-02-24 18:29:16

+0

我不知道這是否會爲後臺作業工作。客戶創建後臺作業,不會等到作業完成。所以當工作人員執行「sendComplete」時,客戶端已經完成執行。 – Aley 2013-02-25 11:12:15