zoukankan      html  css  js  c++  java
  • 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);
    });
    
  • 相关阅读:
    “Clang” CFE Internals Manual---中文版---"Clang"C语言前端内部手册
    LLVM每日谈之十七 LLVM/Clang的学习的思考
    Using Clang as a Library----Choosing the Right Interface for Your Application---翻译
    IT人员必备技能之Over the Wall.
    离散傅立叶变换之听声音破解电话号码
    Google Summer of Code: C++ Modernizer Improvements----Monday, November 18, 2013
    Design: cpp11-migrate
    C++11 迁移器的状态--2013年4月15日
    购物系统③完结篇
    (转)Eclipse中junit框架的使用——单元测试
  • 原文地址:https://www.cnblogs.com/danhuang/p/13277498.html
Copyright © 2011-2022 走看看