• Swoole 协程的并发调用及使用示例


    示例一:

    利用通道pop会自动挂起当前协程,等待生产者推送数据的特性,实现并发调用,并在协程完成后组合结果集。

    $serv = new SwooleHttpServer("127.0.0.1", 9503, SWOOLE_BASE);
    
    $serv->on('request', function ($req, $resp) {
        $chan = new SwooleCoroutineChannel(2);
        go(function () use ($chan) {
            $cli = new SwooleCoroutineHttpClient('www.qq.com', 80);
            $cli->set(['timeout' => 10]);
            $cli->setHeaders([
                'Host' => "www.qq.com",
                'User-Agent' => 'Chrome/49.0.2587.3',
                'Accept' => 'text/html,application/xhtml+xml,application/xml',
                'Accept-Encoding' => 'gzip',
            ]);
            $ret = $cli->get('/');
            $chan->push(['www.qq.com' => $cli->body]);
        });
    
        go(function () use ($chan) {
            $cli = new SwooleCoroutineHttpClient('www.baidu.com', 80);
            $cli->set(['timeout' => 10]);
            $cli->setHeaders([
                'Host' => "www.baidu.com",
                'User-Agent' => 'Chrome/49.0.2587.3',
                'Accept' => 'text/html,application/xhtml+xml,application/xml',
                'Accept-Encoding' => 'gzip',
            ]);
            $ret = $cli->get('/');
            $chan->push(['www.baidu.com' => $cli->body]);
        });
    
        $result = [];
        for ($i = 0; $i < 2; $i++)
        {
            // 当通道为空时,会自动挂起当前协程,等待生产者推送数据后,重新调度进来
            $result += $chan->pop();
        }
        $resp->end(json_encode($result));
    });
    $serv->start();
    

    示例二:

    利用Swoole封装好的WaitGroup类,实现并发调用,并在协程完成后组合结果集。

    底层也是基于通道的计数、push和pop实现的。

    <?php
    Co
    un(function () {
        $wg = new SwooleCoroutineWaitGroup();
        $result = [];
    
        // 增加第一个计数
        $wg->add();
        // 启动第一个协程
        go(function () use ($wg, &$result) {
            //启动一个协程客户端client,请求淘宝首页
            $cli = new SwooleCoroutineHttpClient('www.taobao.com', 443, true);
            $cli->setHeaders([
                'Host' => 'www.taobao.com',
                'User-Agent' => 'Chrome/49.0.2587.3',
                'Accept' => 'text/html,application/xhtml+xml,application/xml',
                'Accept-Encoding' => 'gzip',
            ]);
            $cli->set(['timeout' => 1]);
            $cli->get('/index.php');
    
            $result['taobao'] = $cli->body;
            $cli->close();
    
            // 标记任务完成
            $wg->done();
        });
    
        // 增加第二个计数
        $wg->add();
        // 启动第二个协程
        go(function () use ($wg, &$result) {
            //启动一个协程客户端client,请求百度首页
            $cli = new SwooleCoroutineHttpClient('www.baidu.com', 443, true);
            $cli->setHeaders([
                'Host' => 'www.baidu.com',
                'User-Agent' => 'Chrome/49.0.2587.3',
                'Accept' => 'text/html,application/xhtml+xml,application/xml',
                'Accept-Encoding' => 'gzip',
            ]);
            $cli->set(['timeout' => 1]);
            $cli->get('/index.php');
    
            $result['baidu'] = $cli->body;
            $cli->close();
    
            // 标记任务完成
            $wg->done();
        });
    
        // 挂起当前协程,等待所有任务完成后恢复当前协程的执行
        $wg->wait();
        //这里 $result 包含了 2 个任务执行结果
        var_dump($result);
    });
    
  • 相关阅读:
    git的操作流程命令步骤 软件测试媛
    IT相关的编程技术类学习网站整理 软件测试媛
    Linux中的centos下使用docker搭建gitlab步骤 软件测试媛
    Windows下安装MSI格式的MySQL8.0,且使用自定义配置安装步骤 软件测试媛
    MySQL远程连接工具之Navicat Premium下载及安装步骤 软件测试媛
    截止2021年底,我国18个税种中已有12个税种完成立法
    国产银河麒麟Kylin V10操作系统如何把常用文件夹加入左侧侧边栏(类似windows文件资源管理器中的收藏夹)
    消费税
    做任何事(决策)之前都要先考虑成本,再考虑收益
    具名组匹配(ES9)更改时间格式
  • 原文地址:https://www.cnblogs.com/danhuang/p/13277498.html
Copyright © 2020-2023  润新知