2015-04-27 2 views
3

Я пытаюсь использовать pthreads в PHP, чтобы ускорить серию вычислений, которые в настоящий момент максимируют одно ядро ​​процессора в течение нескольких секунд. Я разделить расчеты на ряд диапазонов и бегаю каждый диапазон в родительской теме:Возврат значения вызывающему потоку

$threads = array(); 
    foreach($cp as $c) { 
     $threads[$c] = new ThreadedMatcher($params); 
     $threads[$c]->start(); 
    } 

я тогда хочу array_merge массивов, созданные в каждом дочернем потоке (для каждого диапазона) в родительском потоке, чтобы получить значение по всему набору данных.

Я понимаю, что мне нужно использовать join() в родительском потоке, чтобы дождаться окончания потока, но как я могу получить значение из дочернего потока в родительский поток?

ответ

2

Попробуйте это:

Это разделит Payload в соответствии с вашими доступными ядрами, зацикливание по партии, чтобы не превышать максимально доступные процессоры нити. Я использую этот очень простой принцип для многих других возможностей Pthreads, которые я тестировал. Простой и самый эффективный для меня до сих пор.

Работает безупречно с серверами ксенонов и 80 доступными потоками Cpus более 100 миллионов итераций в течение нескольких часов.

$Pay_Load=array(
array('id'=>$id,'query'=>$query1,'param'=>$param1), 
array('id'=>$id,'query'=>$query2,'param'=>$param2), 
/*... can be hundreds...just an example...*/ 
) 

$Nb_of_Cpus=4; 
$Nb_of_threads=$Nb_of_Cpus*2; 
$Batch_Works=array_chunk($Pay_Load,$Nb_of_threads); 

$threads = []; 
$results = array(); 

foreach ($Batch_Works as $batch) { 
    foreach ($batch as $key => $params) { 
     $threads[$key] = new ThreadedMatcher($params); 
     $threads[$key]->start(); 
    } 
    foreach ($batch as $key => $params) { 
     $threads[$key]->join(); 
     $returned_result=$threads[$key]->result; 
     $returned_id=$threads[$key]->id; 
     $result=array('id'=>$returned_id,'result'=>$returned_result); 
     array_push($results, result);  
    } 
} 
/* all returned results are now in the same array */ 
/* with the original Payload id as an example here */ 
var_dump($results); 
+0

Как эти строки получать данные из ThreadedMatcher? $ Returned_result = $ нити [$ ключ] -> результат; $ returns_id = $ threads [$ key] -> id; – James

+0

Да. Установите их как общедоступные в классе. – cpugourou

+0

Точнее. – cpugourou

2

Полный класс:

class ThreadedMatcher extends Thread { 

private $query; 
private $param; 
public $result; 
public $id; 


public function __construct($params) { 

    $this->query = $params['query']; 
    $this->param = $params['param']; 
    $this->id= $params['id']; 

} 

public function run() { 

    /* do some stuff*/ 
    echo ($this->query); 
    echo ($this->param); 

    $this->result = rand(100, 200); 
} 
} 

$Pay_Load=array(
array('id'=>$id,'query'=>$query1,'param'=>$param1), 
array('id'=>$id,'query'=>$query2,'param'=>$param2), 
/*... can be hundreds...just an example...*/ 
) 

$Nb_of_Cpus=4; 
$Nb_of_threads=$Nb_of_Cpus*2; 
$Batch_Works=array_chunk($Pay_Load,$Nb_of_threads); 

$threads = []; 
$results = array(); 

foreach ($Batch_Works as $batch) { 
    foreach ($batch as $key => $params) { 
     $threads[$key] = new ThreadedMatcher($params); 
     $threads[$key]->start(); 
    } 
    foreach ($batch as $key => $params) { 
     $threads[$key]->join(); 
     $returned_result=$threads[$key]->result; 
     $returned_id=$threads[$key]->id; 
     $result=array($returned_id=>$returned_result); 
     array_push($results, result);  
    } 
} 
/* all returned results are now in the same array */ 
/* with the original Payload id as an example here */ 

var_dump($results); 

$results =(
1=>103, 
2=>234, 
3=>345, 
4=>123) 
+0

Секрет этого процесса заключается в том, что вы готовите свой массив полезных данных, чтобы определить количество итераций, которые будут вычисляться для каждого рабочего. Сортируйте их правильно и соответствующим образом распределите Batch_Works. – cpugourou

Смежные вопросы