2015-12-02 40 views
1

我對posix線程非常新穎,我需要從函數內部啓動和管理線程,這可能嗎?從函數內部啓動線程

我讀過github上的例子,它們非常有幫助,但我仍然無法實現解決方案。

https://github.com/krakjoe/pthreads/tree/master/examples

我有邏輯,不斷增加任務的RabbitMQ。然後我有邏輯消耗這些任務並運行它們。我想使用pthreads並行地運行它們 - 所以每次任務被添加到rabbitmq時,線程立即開始處理它。

無論何時需要使用任務,RabbitMQ都會調用函數或類方法(我指定)。

此代碼已被簡化,以便其更容易閱讀

爲了證明我已經安裝和工作並行線程,這個工程:

<?php 
$workers = []; 
foreach (range(0, 5) as $i) { 
    $workers[$i] = new WorkerThread($i); 
    $workers[$i]->start(); 
} 

這不起作用:

<?php 
$workers = []; 
$callback = function($msg) 
{ 
    $i = $msg->uniqueKey; 
    $workers[$i] = new WorkerThread($i, $msg); 
    $workers[$i]->start(); 
}; 
$channel->basic_consume('queue', '', false, true, false, false, $callback); 

我的問題是,我不能初始化並從函數內部啓動一個線程並讓它們並行運行。

我也嘗試過直接啓動線程而不必調用函數。但是,這並不工作,因爲我要調用start方法並不能做到這一點,發送額外的參數,即使我可以覆蓋該方法,並呼籲家長,這將是一個巨大的黑客:

$channel->basic_consume('queue', '', false, true, false, false, [ new WorkerThread(), 'start' ]); 

如何使用函數或方法啓動pthreads最好嗎?

我意識到這可能是一個非常初學者的問題,也許是一個壞問題,但任何幫助,非常感謝。

+0

是的,這是可能的,否則將不會執行任何進程! –

+0

'''use($ workers)'''似乎缺少了......目前,當控制離開Closure時'''workers''被銷燬,這會破壞WorkerThread包含... –

+0

我已經實現了'$ callback = function($ msg)use($ workers)'但我得到了相同的結果 - 所有的邏輯運行,但仍然不是並行的。 –

回答

0

使用全局變量。函數內部的更改在函數結束後將變爲垃圾,除非它是全局變量。

+0

嗯.........沒有。 –

+0

不是嗎?你能詳細說明嗎? – SOFe