Рубрики
Uncategorized

Применение задачи свула

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

Резюме

Это вторая статья об обучении свулу: применение задачи свула .

  • Часть 1: применение таймера свула

Асинхронная задача Swool, которая в основном реализует выполнение вызывающих асинхронных задач.

Распространенные сценарии: асинхронная обработка платежей, асинхронная обработка заказов, асинхронная обработка журналов, асинхронная отправка электронной почты/SMS и т.д.

Реализация swoole заключается в том, что рабочий процесс обрабатывает запросы данных и назначает их процессу задачи для выполнения.

Официальное представление:

Нижний уровень задачи использует связь сокетов UNIX, которая является полной памятью, без потребления ввода-вывода. Производительность одного процесса может достигать 1 млн/с. Различные процессы используют разные каналы связи, что позволяет максимально использовать многоядерный процессор.

Локальная версия: PHP 7.2.6, swool 4.3.1.

Сказать особо нечего, сначала взгляните на рендеринги:

Код

Код

serv = new swoole_server('0.0.0.0', 9501);
        $this->serv->set([
            'worker \ num' = > 2, // start 2 worker processes
            'max'request' = > 4, // max'request is set to 4 times per worker process
            'task'worker'num' = > 4, // start 4 task processes
            'dispatch [mode' = > 2, // packet distribution policy - fixed mode
        ]);

        $this->serv->on('Start', [$this, 'onStart']);
        $this->serv->on('Connect', [$this, 'onConnect']);
        $this->serv->on("Receive", [$this, 'onReceive']);
        $this->serv->on("Close", [$this, 'onClose']);
        $this->serv->on("Task", [$this, 'onTask']);
        $this->serv->on("Finish", [$this, 'onFinish']);

        $this->serv->start();
    }

    public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        Echo "swoole". Swoole? Version. "Service started". PHP? EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onConnect($serv, $fd) {
        echo "#### onConnect ####".PHP_EOL;
        Echo "client:. $FD." connected ". Php_eol;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onReceive($serv, $fd, $from_id, $data) {
        echo "#### onReceive ####".PHP_EOL;
        echo "worker_pid: {$serv->worker_pid}".PHP_EOL;
        Echo "client: {$FD} email: {$data}". Php_eol;
        $param = [
            'fd'    => $fd,
            'email' => $data
        ];
        $rs = $serv->task(json_encode($param));
        if ($rs === false) {
            Echo "task assignment failed task" $rs.php_;
        } else {
            Echo "task assigned successfully" $rs.php_;
        }
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onTask($serv, $task_id, $from_id, $data) {
        echo "#### onTask ####".PHP_EOL;
        echo "#{$serv->worker_id} onTask: [PID={$serv->worker_pid}]: task_id={$task_id}".PHP_EOL;

        //Business code
        for($i = 1 ; $i <= 5 ; $i ++ ) {
            sleep(2);
            Echo "task {$task {ID} has completed task {$I} / 5". PHP {EOL;
        }

        $data_arr = json_decode($data, true);
        $serv - > send ($data_arr ['fd '],'email:'. $data_arr ['email '].' sent successfully ');
        $serv->finish($data);
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onFinish($serv,$task_id, $data) {
        echo "#### onFinish ####".PHP_EOL;
        Echo "task {$task {ID} completed". PHP {EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onClose($serv, $fd) {
        echo "Client Close.".PHP_EOL;
    }
}

$server = new Server();

Код

client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);

        $this->client->on('Connect', [$this, 'onConnect']);
        $this->client->on('Receive', [$this, 'onReceive']);
        $this->client->on('Close', [$this, 'onClose']);
        $this->client->on('Error', [$this, 'onError']);
    }

    public function connect() {
        if(!$fp = $this->client->connect("127.0.0.1", 9501 , 1)) {
            echo "Error: {$fp->errMsg}[{$fp->errCode}]".PHP_EOL;
            return;
        }
    }

    public function onConnect($cli) {
        Fwrite (stdout, "enter email:");
        swoole_event_add(STDIN, function() {
            Fwrite (stdout, "enter email:");
            $msg = trim(fgets(STDIN));
            $this->send($msg);
        });
    }

    public function onReceive($cli, $data) {
        echo PHP_EOL."Received: ".$data.PHP_EOL;
    }

    public function send($data) {
        $this->client->send($data);
    }

    public function onClose($cli) {
        echo "Client close connection".PHP_EOL;
    }

    public function onError() {

    }
}

$client = new Client();
$client->connect();

Резюме

1. Сколько процессов запущено в вышеуказанной конфигурации?

Всего 8 процессов (1 главный процесс, 1 процесс менеджера, 4 процесса задач, 2 рабочих процесса)

Повторный запуск может не соответствовать указанному выше номеру процесса:

Основной процесс: 22481

Процесс управления: 22485

Процесс выполнения задачи: 22488, 22489, 22490, 22491

Рабочий процесс: 22492, 22493

Обратитесь к официальной схеме процесса:

2. Почему номер рабочего процесса меняется после пяти выполнений?

Поскольку мы установили max’u для рабочего процесса, рабочий процесс автоматически завершится после выполнения задачи с максимальным количеством запросов, а выход процесса освободит всю память и ресурсы. Этот механизм в основном предназначен для решения проблемы переполнения памяти в процессе PHP.

3. Если выполнение задачи ненормально, мы убьем процесс задачи и добавим другой?

Встреча.

IV. как задать номер рабочего задания?

Максимальное значение не должно превышать колебания? Процессор? Число * 1000.

Чтобы просмотреть количество собственных ядер процессора:

echo "swoole_cpu_num:".swoole_cpu_num().PHP_EOL;

Это определяется в зависимости от количества задач проекта, например, за одну секунду будет сгенерировано 200 задач, а для выполнения каждой задачи требуется 500 мс.

Для выполнения 200 задач за 1 с требуется 100 процессов выполнения задач.

100/(1/0.5)

V. как установить номер рабочего?

Значение по умолчанию-количество ядер процессора машины, и максимальное число не должно превышать число процессоров swool * 1000.

Например, запрос занимает 10 мс. Для обеспечения вычислительной мощности 1000 QPS необходимо настроить 10 процессов.

10.01*1000

Предполагая, что каждый процесс занимает 40 м памяти, 10 процессов должны занимать 400 м памяти.

расширять

  • Сервер->ожидание задачи
  • Сервер->taskWaitMulti
  • Сервер->Команда задачи

Справочный документ

  • Справочный документ

Рекомендуемое чтение

  • Системное объяснение Единый вход единого входа
  • Системное объяснение – Защита веб-безопасности PHP
  • Системное объяснение – Технология кэширования PHP
  • Системное объяснение – Проверка подписи интерфейса PHP
  • Системное объяснение – Высокоточная работа PHP с плавающей запятой

Эту статью добро пожаловать переслать, переслать пожалуйста, укажите автора и источник, спасибо!