Я очень новичок в 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 с помощью функции или метода?
Я понимаю, что это может быть очень важный вопрос, возможно, плохой вопрос, но любая помощь очень ценится.
Да, это возможно, иначе не было бы никакого исполнения для какого-либо процесса! –
'' 'use ($ workers)' '' кажется, отсутствует ... на данный момент '' '$ работники'' уничтожается, когда элемент управления закрывает Closure, это уничтожает' '' WorkerThread'''' содержит ... –
Я реализовал '$ callback = function ($ msg) use ($ workers)', но я получаю тот же результат - вся логика выполняется, но все же не параллельна. –