2015-12-02 5 views
1

Я очень новичок в posix-потоках, и мне нужна помощь в запуске и управлении потоками изнутри функции, возможно ли это?Начальные потоки изнутри функции

Я прочитал примеры на github, они очень полезны, но я до сих пор не смог реализовать решение.

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

У меня есть логика, которая постоянно добавляет задачи RabbitMQ. У меня тогда есть логика, которая потребляет эти задачи и запускает их. Я хочу использовать pthreads для запуска их параллельно - поэтому каждый раз, когда задача добавляется в rabbitmq, поток немедленно начинает обрабатывать ее.

RabbitMQ вызывает функцию или метод класса (который я указываю) всякий раз, когда есть задача, которую нужно использовать.

Этот код был упрощен поэтому его легче читать

Чтобы доказать, что у Pthreads установлен и работает, это работает:

<?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); 

Моя проблема в том, что я не могу инициализировать и запускать поток изнутри функции и запускать их параллельно.

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

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

Как лучше ли начинать pthreads с помощью функции или метода?

Я понимаю, что это может быть очень важный вопрос, возможно, плохой вопрос, но любая помощь очень ценится.

+0

Да, это возможно, иначе не было бы никакого исполнения для какого-либо процесса! –

+0

'' 'use ($ workers)' '' кажется, отсутствует ... на данный момент '' '$ работники'' уничтожается, когда элемент управления закрывает Closure, это уничтожает' '' WorkerThread'''' содержит ... –

+0

Я реализовал '$ callback = function ($ msg) use ($ workers)', но я получаю тот же результат - вся логика выполняется, но все же не параллельна. –

ответ

0

Использование глобальных переменных. Изменения внутри функции станут мусором после завершения функции, если только она не является глобальной переменной.

+0

Умм ......... нет. –

+0

Нет? Можете ли вы уточнить? – SOFe