进程、线程、协程

进程、线程、协程

 

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

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


相关推荐

  • ICMP报文格式详解

    ICMP报文格式详解1 引言2 ICMP报文的类型3 ICMP地址掩请求与应答4 ICMP时间戳请求与应答5 ICMP端口不可达差错1引言 ICMP经常被认为是IP层的一个组成部分。它传递差错以及其他需要注意的信息。ICMP报文通常被IP层或更层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。 ICMP报文是在IP数据报内部被传输的,它封装在IP数据报内。

    2022年6月4日
    64
  • ubuntu学习的简单笔记

    l vi编辑器开发步骤A)输入 vi Hello.javaB) 输入 i 插入模式。C)输入 冒号。【保存退出:wq】【退出

    2021年12月28日
    47
  • 强化学习 模仿学习 于robot[通俗易懂]

    强化学习 模仿学习 于robot[通俗易懂]写在前面:分享知识是再好不过的事情。这篇文章主要是总结自己最近看的一些文章以及相关知识。自己在暑假实习的时候学习的就是在物理仿真平台上做robot的强化学习,未来读PhD的时候也被老师继续分配到了这个方向,哈哈。可能要一直从入门到入土了,趁着最近写researchproposal的时候,将最近的理解记录一下。鉴于笔者知识水平有限,若有不妥当之处,还请指出。摘要:robot强化学习模仿学…

    2022年9月19日
    1
  • STM32 的 “位带”操作Bit-banding–学习笔记

    STM32 的 “位带”操作Bit-banding–学习笔记利用2个32MB大小的“虚拟”内存空间实现对2个1MB大小的物理内存空间进行“位”的置位和清除操作。这样就可以有效地对设备寄存器和位于SRAM中的数据变量进行位操作,而不再需要冗长的布尔逻辑运算过程。…

    2022年9月25日
    4
  • nginx默认安装80端口修改[通俗易懂]

    nginx默认安装80端口修改[通俗易懂]nginx默认安装80端口修改nginx默认安装80端口修改nginx默认安装80端口修改nginx安装启动发现80默认端口冲突,一般是和tomcat服务冲突了。所以在这里我们直接取修改nginx的默认端口。通过whereisnginx我们知道了nginx的配置文件目录在配置文件目录下的sites-available目录中我们找到了default文件,进行修改,修改前先备份。vi进去后将80端口修改成8888端口号修改后重启nginx,启动后没有报错。改对应映射nginx.co

    2025年9月7日
    4
  • Java反编译工具Luyten

    Java反编译工具LuytenLuyten是一款很强大的反编译工具包,是一款github的开源工具,软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。工具软件下载路径:https://github.com/deathmarine/Luyten/releases/tag/v0.5.3我比较喜欢直接使用.jar版本,直接在页面打开目标.class或者.jar包文件,即可直观的查看反编译后的源码,很强大下载下…

    2022年6月22日
    45

发表回复

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

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