Рубрики
Uncategorized

Свул? Случай взаимодействия конвейера процесса “родитель-потомок”

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

Не болтай много, переходи прямо к коду

Созданные подпроцессы:

public function __construct()
    {
        $this - > redis = container:: get (swooleredis:: class); // get asynchronous redis for higher performance
        $this->process = new swoole_process(function (swoole_process $process) {
            return $this->process($process);
        }, false, SOCK_DGRAM);
        $this->process->name('Test_Gateway');
        $this->process->useQueue();
        $this - > process - > start(); // start sub process
    }
    
    /**
     *Subprocess processing logic
     * @param swoole_process $process
     */
    private function process(swoole_process $process)
    {
        $client = new spool u client (spool u sock u TCP, spool u sock u async); // asynchronous non blocking
        
        $client->on("connect", function (swoole_client $cli) use ($process) {
            $process->write('connected');
        });
        
        $client->on("receive", function (swoole_client $cli, $data) use ($process) {
            $process->write($data);
        });
        
        $client->on("error", function (swoole_client $cli) use ($process) {
            $process->write('error');
        });
        
        $client->on("close", function (swoole_client $cli) use ($process) {
            $process->write('close');
        });
        
        if ($client->connect('127.0.0.1', 90, -1)) {
        
        } else {
            $process - > write ('gateway connection failed ');
        }
        
        swoole_event_add($process->pipe,
            Function ($pipe) use ($process, $client) {// read the parent process pipeline message
                $client->send($process->read());
            });
    }

Родительский процесс при запуске рабочего:

/**
     * @param swoole_server $serv
     * @param               $worker_id
     */
    public function onWorkerStart(\swoole_server $serv, $worker_id)
    {
        if ($worker_id === 0) {
            swoole_timer_tick(1000, function () {
                $this->process->write('ping');
            });
            $process = $this->process;
            swoole_event_add($process->pipe,
                Function ($pipe) use ($process) {// get the pipe message of the subprocess
                    Echo "subprocess message:" $process - > read(). Php_eol;
                });
        }
    }
  • Клиент Клиент подпроцесса может быть проигнорирован. Эта демонстрация-всего лишь пример того, как скрыть связь по трубопроводу
  • Очереди сообщений нельзя использовать с каналами: $process_push() и $process – > pop();
  • Теоретически регистрация цикла событий в каждом родительско-дочернем процессе может реализовывать отправку и получение сообщений одновременно
  • Другие последующие дополнения

Оригинал: “https://developpaper.com/swoole-process-parent-child-process-pipeline-communication-case/”