Рубрики
Uncategorized

Новые функции mix PHP V2: совместная программа и таймер

Автор оригинала: David Wong.

Ассоциация

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();
    }

}