示例一:

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

$serv = new Swoole\Http\Server("127.0.0.1", 9503, SWOOLE_BASE);

$serv->on('request', function ($req, $resp) {
$chan = new Swoole\Coroutine\Channel(2);
go(function () use ($chan) {
$cli = new Swoole\Coroutine\Http\Client('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 Swoole\Coroutine\Http\Client('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\run(function () {
$wg = new \Swoole\Coroutine\WaitGroup();
$result = []; // 增加第一个计数
$wg->add();
// 启动第一个协程
go(function () use ($wg, &$result) {
//启动一个协程客户端client,请求淘宝首页
$cli = new \Swoole\Coroutine\Http\Client('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 \Swoole\Coroutine\Http\Client('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);
});

Swoole 协程的并发调用及使用示例的更多相关文章

  1. 理解Go协程与并发

    协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) fun ...

  2. 理解Go协程与并发(转)

    理解Go协程与并发   协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: Copy package main import ( "fmt" " ...

  3. [Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程

    大家知道 Swoole 提供了方便于服务器.网络编程的模式,简化了多进程编程. 这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升. 但是这一切还没有让人足够兴 ...

  4. Swoole 协程与 Go 协程的区别

    Swoole 协程与 Go 协程的区别 进程.线程.协程的概念 进程是什么? 进程就是应用程序的启动实例. 例如:打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源,数据资源,独立的内存 ...

  5. Swoole 协程简介

    什么是协程 协程可以简单理解为线程,只不过这个线程是用户态的,不需要操作系统参与,创建.销毁和切换的成本都非常低. 协程不能利用多核 cpu,想利用多核 cpu 需要依赖 Swoole 的多进程模型. ...

  6. 11.python3标准库--使用进程、线程和协程提供并发性

    ''' python提供了一些复杂的工具用于管理使用进程和线程的并发操作. 通过应用这些计数,使用这些模块并发地运行作业的各个部分,即便是一些相当简单的程序也可以更快的运行 subprocess提供了 ...

  7. Swoole协程与传统fpm同步模式比较

    如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP.那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用. 首先,Swoole 只能运行在命令行(Cli)模 ...

  8. swoole| swoole 协程初体验 转

    swoole| swoole 协程初体验   date: 2018-5-30 14:31:38title: swoole| swoole 协程初体验description: 通过协程的执行初窥 swo ...

  9. swoole 协程介绍

    协程的执行顺序: 1 2 3 4 5 6 7 8 9 go(function () {     echo "hello go1 \n"; });   echo "hell ...

随机推荐

  1. java_IO总结(一)

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节(我想,文章太长了,谁都没耐心翻到最后) 对于文件内容的操作 ...

  2. SVN终端演练(个人开发\多人开发)

    SVN终端演练(个人开发) ### 1. 命令格式 命令行格式: svn <subcommand> [options] [args]       svn 子命令 [选项] [参数]     ...

  3. Linux的命令行基础

    1.对于全局配置文件和用户配置文件的认识 全局配置都存储在etc目录下,如/etc/profile文件,/etc/bashrc文件以及/etc/profile.d/目录下的.sh文件 用户配置都存储在 ...

  4. Nginx 架构基础

    1 Nginx请求处理流程 2 Nginx进程结构 3 Nginx进程管理:信号 3.1 Master进程 监控worker进程 CHLD 管理worker进程 接收信号 TERM,INT QUIT ...

  5. IOS 真机调试和发布相关证书

    一.成员介绍1.    Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1)    Developer Certification(开发证书)安装在电脑上 ...

  6. [BUUCTF]REVERSE——[FlareOn4]IgniteMe

    [FlareOn4]IgniteMe 附件 步骤: 例行检查,32位程序,无壳 32位ida载入 当满足第10行的if条件时,输出G00d j0b!提示我们成功,看一下sub_401050函数 3.s ...

  7. [BUUCTF]PWN——wustctf2020_getshell1/2

    wustctf2020_getshell 附件 步骤: 例行检查,32位程序,开启了NX保护 本地试运行一下程序,看看大概的情况 32位ida载入,习惯性的检索程序里的字符串,发现了后门函数 shel ...

  8. 如何高效地把Spring boot学到能干活的程度

    Spring boot要学什么?要学到什么程度?以及相关的学习方法是什么?这些很难量化,但极好形容:需要学到能帮你找到一份工作的程度.   任何脱离工作脱离实际的学习,都是没有意义的.比如程序员运行通 ...

  9. Java Record 的一些思考 - 默认方法使用以及基于预编译生成相关字节码的底层实现

    快速上手 Record 类 我们先举一个简单例子,声明一个用户 Record. public record User(long id, String name, int age) {} 这样编写代码之 ...

  10. 网络路径排查工具使用/原理浅析(MTR、traceroute、tracepath、windows下besttrace)

    在请求网络资源获取缓慢或者有丢包过程中.经常会使用到网络路径探测工具.linux 下最常用的有mtr.traceroute.tracepath 等. 你是否有一点疑惑,路径探测的原理到底是如何完成的, ...