Swoole从入门到入土(27)——协程[协程容器]
这一章开始,我们要开始全方位讨论Swoole为我们提供的协程机制。在swoole中所有的协程必须在协程容器里面创建(Swoole\Coroutine\Scheduler),Swoole 程序启动的时候大部分情况会自动创建协程容器,用 Swoole 启动程序的方式一共有三种:
- 调用异步风格服务端程序的 start 方法,此种启动方式会在事件回调中创建协程容器,参考 enable_coroutine。
- 调用 Swoole 提供的 2 个进程管理模块 Process 和 Process\Pool 的 start 方法,此种启动方式会在进程启动的时候创建协程容器,参考这两个模块构造函数的 enable_coroutine 参数。
- 其他直接裸写协程的方式启动程序,需要先创建一个协程容器 (Co\run() 函数,可以理解为 java、c 的 main 函数)。
示例1:启动一个全协程的HTTP服务器
Co\run(function () {
$server = new Co\Http\Server("127.0.0.1", 9502, false);
$server->handle('/', function ($request, $response) {
$response->end("<h1>Index</h1>");
});
$server->handle('/test', function ($request, $response) {
$response->end("<h1>Test</h1>");
});
$server->handle('/stop', function ($request, $response) use ($server) {
$response->end("<h1>Stop</h1>");
$server->shutdown();
});
$server->start();
});
echo 1;//得不到执行
示例2:添加2个并发协程
Co\run(function () {
go(function() {
var_dump(file_get_contents("http://www.xinhuanet.com/"));
});
go(function() {
Co::sleep(1);
echo "done\n";
});
});
echo 1;//可以得到执行
关于协程,我们需要注意以下几点:
- 不可以嵌套 Co\run()。(Co\run() 里面的逻辑如果有未处理的事件在 Co\run() 之后就进行 EventLoop,后面的代码将得不到执行,反之,如果没有事件了将继续向下执行,可以再次 Co\run()。)
- 上文的 Co\run() 函数其实是对 Swoole\Coroutine\Scheduler 类 (协程调度器类) 的封装,下面我们就一起详细了解 Swoole\Coroutine\Scheduler 的成员。
成员函数
1) set():设置协程运行时参数。是 Coroutine::set 方法的别名。
Swoole\Coroutine\Scheduler->set(array $options): bool

示例 :
$sch = new Co\Scheduler;
$sch->set(['max_coroutine' => 100]);
2) getOptions():获取设置的协程运行时参数。是 Coroutine::getOptions 方法的别名。
Swoole\Coroutine\Scheduler->getOptions(): null|array
3) add():添加任务
Swoole\Coroutine\Scheduler->add(callable $fn, ... $args): bool
$fn:回调函数
$args:可选参数,将传递给协程
示例:
$scheduler = new Swoole\Coroutine\Scheduler;
$scheduler->add(function ($a, $b) {
Co::sleep(1);
echo assert($a == 'hello') . PHP_EOL;
echo assert($b == 12345) . PHP_EOL;
echo "Done.\n";
}, "hello", 12345); $scheduler->start();
注意:与 go 函数不同,这里添加的协程不会立即执行,而是等待调用 start 方法时,一起启动并执行。如果程序中仅添加了协程,未调用 start 启动,协程函数 $fn 将不会被执行。
4) parallel():添加并行任务。与 add 方法不同,parallel 方法会创建并行协程。在 start 时会同时启动 $num 个 $fn 协程,并行地执行。
Swoole\Coroutine\Scheduler->parallel(int $num, callable $fn, ... $args): bool
$num:启动协程的个数
$fn:回调函数
$args:可选参数,将传递给协程
示例:
$sch = new Swoole\Coroutine\Scheduler;
$sch->parallel(10, function ($t, $n) {
Co::sleep($t);
echo "Co ".Co::getCid()."\n";
}, 0.05, 'A');
$sch->start();
5) start():启动程序,遍历 add 和 parallel 方法添加的协程任务,并执行。
Swoole\Coroutine\Scheduler->start(): bool
返回值:启动成功,会执行所有添加的任务,所有协程退出时 start 会返回 true;启动失败返回 false,原因可能是已经启动了或者已经创建了其他调度器无法再次创建
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。
Swoole从入门到入土(27)——协程[协程容器]的更多相关文章
- Python全栈开发-Day10-进程/协程/异步IO/IO多路复用
本节内容 多进程multiprocessing 进程间的通讯 协程 论事件驱动与异步IO Select\Poll\Epoll——IO多路复用 1.多进程multiprocessing Python ...
- RocketMQ入门到入土(二)事务消息&顺序消息
接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...
- Hexo结合Stun静态博客搭建从入门到入土
摘要 安装npm,安装hexo相关依赖,安装主题stun 修改hexo配置,修改stun配置,部署到github,gitee实现静态访问 给博客加上全局搜索,访问量统计 hexo博客编写模板 tips ...
- QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置
引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...
- QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系
摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...
- QT从入门到入土(三)——信号和槽机制
摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
- Swoole 中使用通道(Channel)实现协程间通讯(消息队列)
通道 Coroutine\Channel 使用本地内存,不同的进程之间内存是隔离的. 只能在同一进程的不同协程内进行 push 和 pop 操作. Co::set(['hook_flags'=> ...
- Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器
WebSocket 异步风格服务器 WebSocket\Server 继承自 Http\Server,所以 Http\Server 提供的所有 API 和配置项都可以使用. # ws_server.p ...
- Swoole 中使用 HTTP 异步服务器、HTTP 协程服务器
HTTP 异步风格服务器 # http_server.php $http = new Swoole\Http\Server("0.0.0.0", 9501); // 设置服务器运行 ...
随机推荐
- CPU信息查看的工具
CPU信息查看的工具 背景 信创国产化如火如荼. CPU的型号其实越来越多 lscpu出来的结果其实太抽象, 对CPU的缓存架构显示不充分 今天在看大佬的文章是看到了一个工具: hwloc 感觉非常优 ...
- [转帖]Web技术(六):QUIC 是如何解决TCP 性能瓶颈的?
文章目录 一.QUIC 如何解决TCP的队头阻塞问题? 1.1 TCP 为何会有队头阻塞问题 1.2 QUIC 如何解决队头阻塞问题 1.3 QUIC 没有队头阻塞的多路复用 二.QUIC 如何优化T ...
- 【转帖】Windows Server 2016与旧版本系统比较
一.性能和可扩性 特征描述 Windows Server 2012/2012 R2 标准版和数据中心 Windows Server 2016 标准版和数据中心 物理内存(主机)支持 每个物理服务器至多 ...
- systemctl 关闭图形界面的办法
开机以命令模式启动,执行: systemctl set-default multi-user.target 开机以图形界面启动,执行: systemctl set-default graphica ...
- clickhouse 优化实践,万级别QPS数据毫秒写入和亿级别数据秒级返回 | 京东云技术团队
1.背景 魔笛活动平台目前在采集每个活动的用户行为数据并进行查询,解决线上问题定位慢,响应不及时的问题,提升客诉的解决效率.目前每天采集的数据量5000万+,一个月的数据总量15亿+,总数据量40亿+ ...
- React中兄弟组件通信和组件跨级传递Context的使用
React兄弟组件之间的通信 Child2组件需要去更改Child1组件中的数据. 因为Child1和Child2是兄弟组件 所以数据和事件都放在最进的父级组件中去 兄弟组件通信的简单使用 impor ...
- ORM-gorm
ORM-gorm 官方文档 http://gorm.book.jasperxu.com/ https://learnku.com/docs/gorm/v2 gorm文档 gorm文档2
- CMake出错的处理
在windows上使用cmake来c++的程序,遇到一个问题 问题排查 试过在电脑上单独使用gcc是可以编译成功的,那么就可能是IDE集成的问题了 IDE的编译工具链从mingw换成vs,编译通过 让 ...
- Elasticsearch向量检索的演进与变革:从基础到应用
Elasticsearch向量检索的演进与变革:从基础到应用 1.引言 向量检索已经成为现代搜索和推荐系统的核心组件. 通过将复杂的对象(例如文本.图像或声音)转换为数值向量,并在多维空间中进行相似性 ...
- 大语言模型的预训练[5]:语境学习、上下文学习In-Context Learning:精调LLM、Prompt设计和打分函数设计以及ICL底层机制等原理详解
大语言模型的预训练[5]:语境学习.上下文学习In-Context Learning:精调LLM.Prompt设计和打分函数(Scoring Function)设计以及ICL底层机制等原理详解 1.I ...