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); // 设置服务器运行 ...
随机推荐
- 【VSCode】秒下vscode
有时从vscode官网下载速度奇慢甚至失败,介绍一种方法可以秒下 进入官网选择要下载的版本 像我的电脑,下载网址根本打不开 修改下载网址,替换下载地址中红框字符串:vscode.cdn.azure.c ...
- Go-错误栈信息
Go中错误栈信息 .\main.go:22:2: number1 declared but not used .\main.go 错误发生的文件 22:2 文件的22行第2列 number1 decl ...
- [转帖]TiDB Control 使用说明
https://docs.pingcap.com/zh/tidb/stable/tidb-control TiDB Control 是 TiDB 的命令行工具,用于获取 TiDB 状态信息,多用于调试 ...
- [转帖]ORACLE USERENV函数
https://www.cnblogs.com/youngerger/p/8862210.html ORACLE USERENV函数 USERENV返回关于当前会话的信息.此信息可以用于编写一个应用程 ...
- [转帖]fio工具中的iodepth参数与numjobs参数-对测试结果的影响
测试环境 3台服务器:ceph配置内外网分离,外网使用万兆线,内网使用千兆线,osd共21个. 1台客户端:安装fio工具.内核客户端,使用万兆线. 测试目的 针对fio工具中的iodepth(队列深 ...
- [转帖]FIO – IO压力测试工具
https://blog.csdn.net/younger_china/article/details/71129541 <存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于d ...
- [转帖]configure 各种配置
https://api.dandelioncloud.cn/article/details/1487329970564485121 -build=编译该软件所使用的平台 -host=该软件将运行的平台 ...
- [转帖]Linux块层技术全面剖析-v0.1
Linux块层技术全面剖析-v0.1 perftrace@gmail.com 前言 网络上很多文章对块层的描述散乱在各个站点,而一些经典书籍由于更新不及时难免更不上最新的代码,例如关于块层的多队列.那 ...
- 【转帖】eBay 云计算“网”事|网络重传篇
https://www.infoq.cn/article/iy1drmf6wk8up14dchq8/ #导读 在之前的eBay云计算"网"事|网络超时篇和eBay云计算" ...
- echarts显示地图
<template> <div class="managingPatientSize"> <div id="china-map"& ...