进程、线程、协程

进程、线程、协程

 

关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西。

1.进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

2.线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

3.协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

PHP中的协程实现基础 yield

yield的根本实现是生成器类,而迭代器类是迭代器接口的实现:

Generator implements Iterator {
   
    public mixed current ( void ) // 返回当前产生的值
    public mixed key ( void ) // 返回当前产生的键
    public void next ( void ) // 生成器继续执行
    public void rewind ( void ) // 重置迭代器,如果迭代已经开始了,这里会抛出一个异常。
                                             // renwind的执行将会导致第一个yield被执行, 并且忽略了他的返回值.
    public mixed send ( mixed $value ) // 向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器   
                                            // 不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。
    public void throw ( Exception $exception ) // 向生成器中抛入一个异常
    public bool valid ( void ) // 检查迭代器是否被关闭
    public void __wakeup ( void ) // 序列化回调,抛出一个异常以表示生成器不能被序列化。
}

以上解析可以参考PHP官方文档。

http://php.net/manual/zh/clas…

以及鸟哥翻译的这篇详细文档:

http://www.laruence.com/2015/…

我就以他实现的协程多任务调度为基础做一下例子说明并说一下关于我在阻塞方面所做的一些思考。

自定义简单定时执行任务示例:

(此例子必须依赖于以上鸟哥实现的协程调度代码)

 
class timer {
   
    private $start = 0; // 定时开始时间
    private $timer; // 间隔的时间差,单位秒
    private $value = 0; // 产生的结果值
    private $callback; // 异步回调
    private $isEnd = false; // 当前定时器任务是否结束
    public function __construct($timer,callable $callback)
    {
   
        $this->start = time();
        $this->timer = $timer;
        $this->callback = $callback;
    }
    public function run() {
   
        if($this->valid()) {
   
            $callback = $this->callback;
            $callback($this->value ++,$this);
            $this->start = time();
        }
    }
    /**
     * 定时执行检查
     */
    public function valid() {
   
        $end 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113656.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库ER图怎么画

    数据库ER图怎么画https://jingyan.baidu.com/article/624e745961c6a134e9ba5a40.html

    2022年6月21日
    22
  • Android之查看外部依赖jar的源码_android private libralies does not allow modifications to source

    在Eclipse中开发android的应用程序时,有时想查看函数的内部实现,但是当在函数上点击ctrl和鼠标左键的时候,往往出现如下提示: Class File EditorSource not foundThe JAR of this class file belongs to container ‘Android’  which does not allow modifications to

    2022年3月11日
    43
  • ya系列圆振动筛_L型厨房设计好不好

    ya系列圆振动筛_L型厨房设计好不好‘资料下载链接’:https://download.csdn.net/download/dwf1354046363/21778034YAH2460型圆振动筛设计摘要目前我国各种选煤厂使用的设备中,振动筛(筛分机)是问题较多、维修量较大的设备之一。这些问题突出表现在筛箱断梁、裂帮、稀油润滑的箱式振动器漏油、齿轮打齿、轴承温升过高、噪声过大等问题,同时伴有传动带跳带、断带等故障。这类问题直接影响了振动筛(筛分机)的使用寿命,严重影响了生产。YAH—2460型圆振动筛可以很好的解决此类问题,因此本

    2022年10月2日
    0
  • NB-IoT、LoRa、RPMA从业者请勿选择性遗忘,你们绕得开监管的“五指山”吗?

    NB-IoT、LoRa、RPMA从业者请勿选择性遗忘,你们绕得开监管的“五指山”吗?

    2022年3月13日
    51
  • java面试不会怎么办_【必须录用】面试遇到不会回答的问题,该怎么办?

    java面试不会怎么办_【必须录用】面试遇到不会回答的问题,该怎么办?一.前言今天给大家讲讲面试过程当中最长遇到的窘境,也是最能体现一个候选人临场应变能力的地方,那就是当我们在面试的过程当中,遇到的问题回答不上来的时候,该怎么办。二.误区在开始讲解之前,先纠正一个误区,那就是对于一场面试而言,最后的结果好坏并不完全取决于面试当中的问题是否都回答了上来。能不能录取和是否回答出所有问题并没有直接的联系。换句话说,我自己经历过的,无论是面试也好,还是面别人也罢,问题没…

    2022年7月9日
    21
  • ubuntu18.04录屏软件_linux录屏软件推荐

    ubuntu18.04录屏软件_linux录屏软件推荐1安装1sudoadd-apt-repositoryppa:peek-developers/stablesudoaptupdatesudoaptinstallpeek2.peek使用我想使用peek录制我操作某一软件,做一个教程。发现选不中要录的软件,因为peek始终在最前端,你只能选用peek,咋么办?将peek放置要录的区域,选择录制,出现倒计时在倒计时这几秒内,右键peek顶部,取消Alwayontop在桌面的菜单栏,选择软件,这时,这个软件处于最前端,然

    2022年9月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号