go 协程回调函数 传入参数_swoole协程深入浅出

c3fc9cc116f2ab43208b91ca52e57659.png

协程的介绍

协程是什么?

A coroutine is a function that can suspend its execution (yield) until the given given YieldInstruction finishes.

简单的说协程是寄宿在线程下程序员实现的一种跟更轻量的并发的协作轻量线程

随着程序员人群的增大,大佬也不断的爆发式增长,当然就开始有人觉得线程不好用了,那怎么办呢?当然是基于线程的理念上再去实现一套更加轻量、更好骗star的一套轻量线程(事实上协程不能完全被认为线程,因为一个线程可以有多个协程)

协程和线程的区别

本质

线程 内核态
协程 用户态

调度方式

线程的调度方式为系统调度,常用的调度策略有分时调度抢占调度。说白就是线程的调度完全不受自己控制

协程的调度方式为协作式调度 不受内核控制由自由策略调度切换等等

协作式调度?

f1b18146077c67d8e2fa3db9d17c1fd8.png

上述说了协程是用户态的,所以所谓的协作式调度直接可以理解为是程序员写的调度方式,也就是我想怎么调度就怎么调度,而不用通过系统内核被调度。

深入浅出理解swoole的协程

既然打算浅入理解的swoole的协程,我们必须要知道swoole的协程模型。
swoole的协程是基于单线程。可以理解为协程的切换是串行的,再同一个时间点只运行一个协程.

说到这里,肯定就有人问了。go呢,go的协程的是基于多线程。当然各有各的好处,具体可以自行使用搜索引擎了解

我们可以直接copy & paste 下面代码,再本地的环境进行的 demo run

<?php

$func = function ($index, $isCorotunine = true) {

$isCorotunine && SwooleCoroutine::sleep(2);

echo "index:" . $index . ", value:" . (++$count) . PHP_EOL;

echo "is corotunine:" . intval($isCorotunine) . PHP_EOL;

};

$func(1, false);

go($func, 2, true);

go($func, 3, true);

go($func, 4, true);

go($func, 5, true);

go($func, 6, true);

$func(7, false);

会得到以下结果

index:1, value:1

is corotunine:0

index:7, value:2

is corotunine:0

index:2, value:3

is corotunine:1

index:6, value:4

is corotunine:1

index:5, value:5

is corotunine:1

index:4, value:6

is corotunine:1

index:3, value:7

is corotunine:1

肯定有小伙伴会想,哇塞,尽然1秒都执行完了,一点都不堵塞啊!!

d9be573df3c8d395aaca29d1b4dacba8.png


好了,事实上关于1秒执行完的事情可以回过头再去看下协程的概念。
我们可以关注的是执行顺序,1和7是非协程的执行能立马返回结果符合预期。
关于协程的调度顺序
为什么是26543不是65432或者23456有序的返回呢

为了找到我们的答案,我们只能通过源码进行知晓一些东西

分析源码

42bbc6e67d8a59ffacd27759b3cd1de0.png

如果没有较强的基础还有啃烂的apcu的前提下
我们需要关心的是以下两个yield 一个是协程的让出CPUresume 恢复协程

34771421d76d47a9f04b0994aa892a19.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值