Во время выполнения задачи "поток" может сообщать что либо в родительский процесс. Для этого каждый поток является диспетчером событий.
Отправка события выполняется с помощью метода trigger
. Вместе с событием можно передать различные данные. Например состояние работы или любую другую информацию.
Подписаться на события в родительском процессе можно с помощью метода bind
. При подписке кроме коллбэка и имени события можно также указать дополнительный аргумент. Его значение будет передаваться в коллбэк третьим аргументом при каждом срабатывании.
class ExampleThread extends Thread
{
const EV_NAME = 'example_name';
function process()
{
// ...
$this->trigger(self::EV_NAME, $event_data);
// ...
}
}
$thread = new ExampleThread();
$thread->bind(ExampleThread::EV_NAME, function($event_name, $event_data, $additional_arg) {
// ...
}, $additional_arg);
$thread->wait()->run()->wait();
Пример генерирования событий из потока можно посмотреть среди остальных примеров.
События из пула потоков получать также просто, как и из одного потока. Просто подписывать нужно на пуле. В этом случае добавляется второй аргумент для колбэка - ID потока, отправившего событие.
$cb = function($event_name, $threadId, $event_data, $additional_arg) {
// ...
};
$pool->bind(ExampleThread::EV_NAME, $cb, $additional_arg);
Внутри потока вызывается все тот же trigger
.
$this->trigger(self::EV_NAME, $event_data);