进程、线程、协程

进程、线程、协程

 

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python读取txt文件中的json数据

    python读取txt文件中的json数据txt文本文件能存储各式各样数据,结构化的二维表、半结构化的json,非结构化的纯文本。存储在excel、csv文件中的二维表,都是可以直接存储在txt文件中的。半结构化的json也可以存储在txt文本文件中。最常见的是txt文件中存储一群非结构化的数据:今天只学习:从txt中读出json类型的半结构化数据importpandasaspdimportjsonf=o…

    2022年5月18日
    152
  • shell 获取系统时间_shell脚本打印当前时间

    shell 获取系统时间_shell脚本打印当前时间在shell脚本里常常需要获取系统时间来处理某项操作,今天系统的学习了一下如何获取系统时间。记录如下:linux的系统时间在shell里是可以直接调用系统变量的如:获取今天时期:`date+%Y%m%d`或`date+%F`或$(date+%y%m%d)命令输出结果如下:[root@centi-C sh]# date +%Y%m%d 20120727 [root@c

    2022年10月10日
    0
  • postman设置环境变量,实现一套接口根据选择的环境去请求不同的url[通俗易懂]

    postman设置环境变量,实现一套接口根据选择的环境去请求不同的url

    2022年2月8日
    43
  • java中的compareto方法的详细介绍

    java中的compareto方法的详细介绍java中的compareto方法的详细介绍JavaComparator接口实例讲解(抽象方法、常用静态/默认方法)一.java中的compareto方法1.返回参与比较的前后两个字符串的as

    2022年7月4日
    23
  • Java实现对List去重

    Java实现对List去重方式一,使用for循环遍历去除List中的重复元素代码如下 publicstaticvoidmain(String[]args){Test07test07=newTest07();System.out.println(test07.getList());}publicListgetList(){…

    2022年5月25日
    40
  • DOS攻击手段_ddos攻击原理与防御方法

    DOS攻击手段_ddos攻击原理与防御方法DDoS介绍DDoS是英文DistributedDenialofService的缩写,意即“分布式拒绝服务”,那么什么又是拒绝服务(DenialofService)呢?可以这么理解,凡是能导致合法用户不能够访问正常网络服务的行为都算是拒绝服务攻击。也就是说拒绝服务攻击的目的非常明确,就是要阻止合法用户对正常网络资源的访问,从而达成攻击者不可告人的目的。分布式拒绝服务攻击一旦被实施,攻击网络包就会从很多DOS攻击源(俗称肉鸡)犹如洪水般涌向受害主机,从而把合法用户的网络包淹没,导致合法用户无法正

    2022年10月1日
    0

发表回复

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

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