Ассоциация
Mix PHP V2 основан на разработке технологии совместной работы с потоковым подключением PHP swool 4. Использование совместной работы почти такое же, как и в golang, включая инкапсулированный пул совместной работы, пул соединений и обработку командной строки, которые относятся к стилю системной библиотеки golang.
В дополнение к отсутствию выбранного случая, mix PHP и golang имеют почти одинаковый процесс сотрудничества. Платформа также предоставляет пул соединений, пул взаимодействия и пакеты обработки командной строки для использования “из коробки”.
канал xgo +
XGO похож на ключевое слово go в golang, которое может начать новый процесс сотрудничества. Канал равен классу каналов golang, который отвечает за передачу данных в различных процессах взаимодействия.
php namespace Console\Commands; use Mix\Core\Coroutine\Channel; use Mix\Core\Event; /** * Class CoroutineCommand * @package Console\Commands * @author liu,jian <[email protected]> */ class CoroutineCommand { /** * main function */ public function main() { xgo(function () { $time = time(); $chan = new Channel(); for ($i = 0; $i < 2; $i++) { xgo([$this, 'foo'], $chan); } for ($i = 0; $i < 2; $i++) { $result = $chan->pop(); } println('Total time: ' . (time() - $time)); }); Event::wait(); } /** *Query data * @param Channel $chan */ public function foo(Channel $chan) { $db = app()->dbPool->getConnection(); $result = $db->createCommand('select sleep(5)')->queryAll(); $DB - > release(); // connections that are not released manually will not be returned to the connection pool and will be discarded at the time of deconstruction $chan->push($result); } }
Результат выполнения равен 5 секундам, что указывает на то, что он выполняется параллельно.
Группа ожидания + отложить
Группа ожидания в точности совпадает с golang, а метод xfer совпадает с ключевым словом golang defer.
Когда параллельное выполнение не требует возврата результатов, можно использовать группу ожидания + отсрочка. Xdefer будет выполняться даже тогда, когда метод создает исключение, чтобы избежать постоянной блокировки.
[email protected]>
*/
class WaitGroupCommand
{
/**
* main function
*/
public function main()
{
xgo(function () {
$wg = WaitGroup::new();
for ($i = 0; $i < 2; $i++) {
$wg->add(1);
xgo([$this, 'foo'], $wg);
}
$wg->wait();
println('All done!');
});
Event::wait();
}
/**
*Query data
* @param WaitGroup $wg
*/
public function foo(WaitGroup $wg)
{
xdefer(function () use ($wg) {
$wg->done();
});
println('work');
throw new \RuntimeException('ERROR');
}
}Даже если возникает исключение исключения RuntimeException, println ("Все сделано!"); не приводило к тому , что изменения в WG блокировались все время.
таймер
В асинхронном программировании часто используются таймеры.
Таймер::новый()Доступен примерпослеСпособ установки одноразового времениотметьтеСпособ установки продолжительности- Чтобы остановить текущий фиксированный период, используйте только метод объекта
$timer->clear ();.
[email protected]>
*/
class TimerCommand
{
/**
* main function
*/
public function main()
{
//One time timing
Timer::new()->after(1000, function () {
println(time());
});
//Continuous timing
$timer = new Timer();
$timer->tick(1000, function () {
println(time());
});
//Stop timing
Timer::new()->after(10000, function () use ($timer) {
$timer->clear();
});
Event::wait();
}
}