示例一:

利用通道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. 使用MyBatis框架时发现的一些小bug

    在大配置MyBatis.xml中:  不能有空节点属性 ,否则启动服务器后点击登录没有反应. 异常问题: ause: java.sql.SQLException: Value '0000-00-00 ...

  2. 『学了就忘』Linux服务管理 — 79、源码包安装的服务管理

    目录 1.源码包服务的启动管理 2.源码包服务的自启动管理 3.让源码包服务被服务管理命令识别 1.源码包服务的启动管理 # 通过源码包的安装路径,找到该服务的启动脚本, # 也就是获得该服务的启动脚 ...

  3. 07- Vue3 UI Framework - Switch 组件

    为了更好的提升用户体验,我们这里再做一个很常用的开关组件 switch 返回阅读列表点击 这里 需求分析 开始之前我们先做一个简单的需求分析 switch 组件应分为选中/未被选中,两种状态 可以通过 ...

  4. 混沌映射初始化种群之Logistic映射

    Logstic混沌映射初始化种群 Step 1:     随机生成一个\(d\)维向量\({X_0}\),向量的每个分量在0-1之间. Step 2:     利用Logistic映射生成N个向量.L ...

  5. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  6. android 基于dex的插件化开发

    安卓里边可以用DexClassLoader实现动态加载dex文件,通过访问dex文件访问dex中封装的方法,如果dex文件本身还调用了native方法,也就间接实现了runtime调用native方法 ...

  7. CSS的三大特性(继承、层叠和优先级)

    CSS的三大特性(继承.层叠和优先级) 1.css属性的继承 CSS中有些属性是可继承的,何为属性的继承? 一个元素如果没有设置某些属性的值,就会跟随(继承)父元素的属性值.当然,一个元素如果有设置自 ...

  8. CF1144A Diverse Strings 题解

    Content 我们定义一个字符串是合法的,当且仅当这个字符串是"连续排列"(按照字母表顺序排序).现在给出 \(n\) 个字符串 \(s_1,s_2,s_3,...,s_n\), ...

  9. python获取命令行传参的两种种常用方法argparse解析getopt 模块解析

    方法一:argparse解析 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2020/5/20 10:38 # @Author:zhan ...

  10. 10分钟快速上车短视频风口:基于uniapp框架创建自己的仿抖音短视APP

    在今年也就是第48次发布的<中国互联网络发展状况统计报告>有这样一个数据,21年的上半年以来,我国我国网民规模达10.11亿,其中短视频用户达8.88亿.碎片化的生活场景下,短视频成为人们 ...