hyperf 协程理解和使用
2021/9/7 6:07:50
本文主要是介绍hyperf 协程理解和使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
协程是一种轻量级的线程,由用户代码来调度和管理,而不是由操作系统内核来进行调度,也就是在用户态进行
创建协程方法
co函数
public function test(){ echo "first id: ". Coroutine::id().PHP_EOL; co(function () { echo "second id: ". Coroutine::id().PHP_EOL; echo "这是co方法产生的协程".PHP_EOL; }); }
访问/index/test
http://ip:9501/index/test
终端显示结果
first id: 2 second id: 3 这是co方法产生的协程
go函数
public function test(){ echo "first id: ". Coroutine::id().PHP_EOL; go(function () { echo "second id: ". Coroutine::id().PHP_EOL; echo "这是go方法产生的协程".PHP_EOL; }); }
访问/index/test
http://ip:9501/index/test
终端显示结果
first id: 2 second id: 3 这是go方法产生的协程
Coroutine::create方法
use Hyperf\Utils\Coroutine; public function test(){ echo "first id: ". Coroutine::id().PHP_EOL; Coroutine::create(function(){ echo "second id: ". Coroutine::id().PHP_EOL; echo "这是coroutine::create方法产生的协程".PHP_EOL; }); }
访问/index/test
http://ip:9501/index/test
终端显示结果
first id: 2 second id: 3 这是coroutine::create方法产生的协程
协程相关方法
判断当前是否处于协程环境(Hyperf\Utils\Coroutine::inCoroutine(): bool)
Hyperf\Utils\Coroutine::inCoroutine(): bool
获取当前协程id
Hyperf\Utils\Coroutine::id()
channel通道
Channel 主要用于协程间通讯
public function test(){ co(function () { $channel = new \Swoole\Coroutine\Channel(); co(function () use ($channel) { $channel->push('子协程的数据'); }); $data = $channel->pop(); echo "获取子协程数据: ".$data; }); }
访问/index/test
http://ip:9501/index/test
获取子协程数据: 子协程的数据
defer特性
public function test(){ Coroutine::defer(function(){ echo "第一个defer".PHP_EOL; }); Coroutine::defer(function(){ echo "第二个defer".PHP_EOL; }); Coroutine::defer(function(){ echo "第三个defer".PHP_EOL; }); echo 'defer test'.PHP_EOL; }
访问/index/test
http://ip:9501/index/test
终端结果显示
defer test 第三个defer 第二个defer 第一个defer
WaitGroup特性
public function test(){ $wg = new \Hyperf\Utils\WaitGroup(); // 计数器加二 $wg->add(2); // 创建协程 A co(function () use ($wg) { mt_srand(); $time = mt_rand(1, 5); sleep($time); // some code echo "协程A执行完成".PHP_EOL; //计算器减一 $wg->done(); }); // 创建协程 B co(function () use ($wg) { mt_srand(); $time = mt_rand(1, 5); sleep($time); // some code echo "协程B执行完成".PHP_EOL; // 计数器减一 $wg->done(); }); // 等待协程 A 和协程 B 运行完成 $wg->wait(); echo "全部程序执行完成".PHP_EOL; }
访问/index/test
http://ip:9501/index/test
终端结果显示
协程B执行完成 协程A执行完成 全部程序执行完成
Parallel特性
use Hyperf\Utils\Exception\ParallelExecutionException; use Hyperf\Utils\Coroutine; use Hyperf\Utils\Parallel; public function test(){ $parallel = new Parallel(); $parallel->add(function () { mt_srand(); $time = mt_rand(1, 5); sleep($time); echo "协程A执行完成".PHP_EOL; return Coroutine::id(); }); $parallel->add(function () { mt_srand(); $time = mt_rand(1, 5); sleep($time); echo "协程B执行完成".PHP_EOL; return Coroutine::id(); }); try{ // $results 结果为 [1, 2] $results = $parallel->wait(); echo "results:".PHP_EOL; var_dump($results); } catch(ParallelExecutionException $e){ // $e->getResults() 获取协程中的返回值。 // $e->getThrowables() 获取协程中出现的异常。 var_dump($e->getResults()); } }
访问/index/test
http://ip:9501/index/test
终端结果显示
协程B执行完成 协程A执行完成 results: array(2) { [1]=> int(4) [0]=> int(3) }
简写版
$results = parallel([ function () { mt_srand(); $time = mt_rand(1, 5); sleep($time); echo "协程A执行完成".PHP_EOL; return Coroutine::id(); }, function () { mt_srand(); $time = mt_rand(1, 5); sleep($time); echo "协程B执行完成".PHP_EOL; return Coroutine::id(); } ]);
协程上下文
public function test(){ co(function(){ Context::set('name','huyongjian'); $name = Context::get('name'); echo $name.PHP_EOL; }); }
访问/index/test
http://ip:9501/index/test
终端结果显示
huyongjian
这篇关于hyperf 协程理解和使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-29RocketMQ底层原理资料详解:新手入门教程
- 2024-11-29RocketMQ源码资料解析与入门教程
- 2024-11-29[开源]6.1K star!这款电视直播源神器真的太赞啦!
- 2024-11-29HTTP压缩入门教程:轻松提升网页加载速度
- 2024-11-29JWT开发入门指南
- 2024-11-28知识管理革命:文档软件的新玩法了解一下!
- 2024-11-28低代码应用课程:新手入门全攻略
- 2024-11-28哪些办公软件适合团队协作,且能够清晰记录每个阶段的工作进展?
- 2024-11-28全栈低代码开发课程:零基础入门到初级实战
- 2024-11-28拖动排序课程:轻松掌握课程拖动排序功能