Skip to content

Latest commit

 

History

History
61 lines (41 loc) · 2.58 KB

2.Events.md

File metadata and controls

61 lines (41 loc) · 2.58 KB

Передача событий из потока


  1. События из потока
  2. События из пула потоков

1 - События из потока

Во время выполнения задачи "поток" может сообщать что либо в родительский процесс. Для этого каждый поток является диспетчером событий.

Отправка события выполняется с помощью метода 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();

Пример генерирования событий из потока можно посмотреть среди остальных примеров.

2 - События из пула потоков

События из пула потоков получать также просто, как и из одного потока. Просто подписывать нужно на пуле. В этом случае добавляется второй аргумент для колбэка - 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);