热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

swoole之协程实现并发

swoole之协程实现并发,Go语言社区,Golang程序员人脉社

主要使用 swoole的子协程 和 协程channel 的两个特征 实现任务并发。
直接上代码说明:

$server = new SwooleHttpServer("0.0.0.0",20000,SWOOLE_PROCESS,SWOOLE_SOCK_TCP);
$server->on("request",function(SwooleHttpRequest $request,SwooleHttpResponse $response){
    $fd = $request->fd;
    if($request->server["request_uri"] == "/favicon.ico"){
        $this->server->close($fd);
        return false;
    }
    $urls = [
        "http://www.estb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25885.html",
        "http://www.sweb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_23660.html",
        "http://www.daiinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25596.html",
        "http://www.us764.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_16724.html",
        "http://www.vieinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25571.html",
        "http://www.estb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25885.html",
        "http://www.sweb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_23660.html",
        "http://www.daiinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25596.html",
        "http://www.us764.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_16724.html",
        "http://www.vieinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25571.html",
        "http://www.estb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25885.html",
        "http://www.sweb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_23660.html",
        "http://www.daiinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25596.html",
        "http://www.us764.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_16724.html",
        "http://www.vieinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25571.html",
        "http://www.estb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25885.html",
        "http://www.sweb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_23660.html",
        "http://www.daiinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25596.html",
        "http://www.us764.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_16724.html",
        "http://www.vieinfo.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25571.html",
        "http://www.estb2b.com/product-detail/BPA-free-80--120-80mm-cash-register-paper-80--120-70mm-thermal-paper-rolls_25885.html",
        ......
    ];
    $taskCount = count($urls);
    $channel = new SwooleCoroutineChannel($taskCount); // 用于子协程与 主进程之间的通信
    $start = time();
    foreach ($urls as $url){
        go(function()use($channel,$url){
            // 在swoole协程中 http 客户端强烈推荐使用composer包 swlib/saber , 该包库功能强大,缺点是只能在 协程环境中使用
            // 该包库是由 swoole 核心开发组开发,用于代替swoole原生协程 客户端
            // 使用详情参考  https://github.com/swlib/saber
             try{
                  $saberRespOnse= SwlibSaberGM::get($url); // 返回 SwlibSaberResponse 对象
                  $code = $saberResponse->getStatusCode();
                  $r = $code . " => " . strlen($saberResponse->getBody());
                  $channel->push($r);
             }catch(Exception $e){
                  $channel->push("Exception : ".$e->getMessage());
             }
        });
    }
    for ($i = 1; $i <= $taskCount; $i++){
        // 阻塞 等待处理结果
        $r= $channel->pop();
        var_dump($r);
    }
    $diff = time() - $start;
    echo "全部完成需要时间差 diff={$diff}s n";
    $response->end("返回响应数据到客户端");
}); 
$server->start();

经本人实测,在同时请求 任务多的情况下,性能尤为明显。以本案例爬取海外站点源码为例,性能比多进程process模型更高,所用时间只需要process模块1/3的时间。
重点掌握 #协程运行生命周期, #协程通信Channel, #协程Http客户端swlib/saber 的使用。

重点说明:协程模式环境下(也是使用协程的缺点),编写的代码与传统同步串行代码存在部分差异,某些pecl扩展和阻塞代码不能在协程环境下使用。
例如: curl扩展,sleep睡眠函数等不能在协程环境模式下使用(详细参考swoole文档)但是swoole官方开发组为之提供了对应的解决方案。使用swoole官方提供的函数或者库能很好解决对用的问题。(例如 mysql/redis客户端等在协程模式下必须使用协程客户端(最好使用基于协程连接池的pool),否则并不能体现很好的性能)


推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文详细解析了ASP.NET 2.0中的Callback机制,不仅介绍了基本的使用方法,还深入探讨了其背后的实现原理。通过对比Atlas框架,帮助读者更好地理解和应用这一机制。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 开发笔记: URL参数处理与API请求示例
    本文记录了如何在开发过程中处理URL参数,并通过GET和POST方法发送API请求的具体步骤。 ... [详细]
  • 深入理解Redis中的字典实现
    本文详细介绍了Redis中字典的实现机制,包括其底层数据结构、哈希表与哈希节点的关系、元素添加方法及rehash操作的具体流程。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 在将Web服务器和MySQL服务器分离的情况下,是否需要在Web服务器上安装MySQL?如果安装了MySQL,如何解决PHP连接MySQL服务器时出现的连接失败问题? ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 本文旨在解决 MySQL 无法连接到 localhost 的常见问题,并提供详细的步骤来确保 MySQL 服务正确启动和配置。 ... [详细]
  • BIEE中的最终用户界面被称为Presentation Layer(展现层)。展现层呈现的内容与用户在Web报表开发界面中看到的一致,使用业务语言进行描述,隐藏了技术细节,如星型模型。本文将详细介绍展现层的设计要点及其与业务模型层的关系。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
author-avatar
多米音乐_35677591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有