进程、线程、协程

举报
lxw1844912514 发表于 2022/03/27 01:29:32 2022/03/27
1k+ 0 0
【摘要】   关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西。 1.进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 2.线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 3.协程和线程一样共享堆,...

 

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

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 
  

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100029145

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。