Swoole 5将移除自动添加Event::wait()特性详解

前言

在之前的版本中,编写Cli命令行脚本中使用异步或协程功能时,Swoole会自动在脚本末尾检测是否有Event::wait()调用,如果没有,底层会自动调用register_shutdown_function在脚本结束时调用Event::wait(),进入事件循环。

这个特性为底层带来了非常多的麻烦,我们不得不做了大量编码工作,以解决带来的问题。即便如此,仍然存在大量潜在的风险,如某些PHP版本下内存泄露,某些特殊用法导致core dump等。在最新的Swoole 5版本中,我们准备抛弃这个历史包袱。不再自动添加 Event::wait() 到PHP的shutdown function列表。

Server、Process、Process\Pool相关程序请忽略此更新

错误实例

go(function () {
 Co::sleep(1);
 echo "done\n";
});

此代码中没有在脚本末尾添加Swoole\Event::wait(),底层会自动注册到shutdown function列表中。相当于:

register_shutdown_function(function () {
 Swoole\Event::wait();
});

go(function () {
 Co::sleep(1);
 echo "done\n";
});

在shutdown阶段处理程序逻辑会带来很多额外的维护性难题。

正确实例

在Swoole 4.4或Swoole 5版本中,建议:

  • 使用Coroutine\Scheduler作为程序的入口
  • 或者在程序末尾手工添加Event::wait()
$scheduler = new Coroutine\Scheduler;
$scheduler->add(function () {
 Co::sleep(1);
 echo "Done.\n";
});
$scheduler->start();

推荐使用

或者:

go(function () {
 Co::sleep(1);
 echo "done\n";
});
Swoole\Event::wait();

不推荐使用

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • Swoole 5将移除自动添加Event::wait()特性详解

    前言 在之前的版本中,编写Cli命令行脚本中使用异步或协程功能时,Swoole会自动在脚本末尾检测是否有Event::wait()调用,如果没有,底层会自动调用register_shutdown_function在脚本结束时调用Event::wait(),进入事件循环. 这个特性为底层带来了非常多的麻烦,我们不得不做了大量编码工作,以解决带来的问题.即便如此,仍然存在大量潜在的风险,如某些PHP版本下内存泄露,某些特殊用法导致core dump等.在最新的Swoole 5版本中,我们准备抛弃这个

  • python编程之requests在网络请求中添加cookies参数方法详解

    哎,好久没有学习爬虫了,现在想要重新拾起来.发现之前学习爬虫有些粗糙,竟然连requests中添加cookies都没有掌握,惭愧.废话不宜多,直接上内容. 我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.content 你没有看错,真的只有三行代码.但是简单归简单,问题还是不少的. 首先,这

  • 基于js中this和event 的区别(详解)

    今天在看javascript入门经典-事件一章中看到了 this 和 event 两种传参形式.因为作为一个初级的前端开发人员平时只用过 this传参,so很想弄清楚,this和event的区别是什么,什么情况下用什么比较合适. onclick = changeImg(this)       vs     onclick = changeImg(event) <img src='usa.gif' onclick="changeImg(event)" /> <scrip

  • Python实现自动清理电脑垃圾文件详解

    经常存在在我们的电脑中的垃圾文件主要是指系统在运行过程中产生的tmp临时文件.日志文件.临时备份文件等.垃圾清理器的作用其实也是对这些文件进行清理,不会影响到我们使用产生的数据文件.如果是手动删除的话要一个一个的找出来去删除就比较麻烦了,用python写一个脚本直接启动就大功告成了. 在这个脚本的实现过程中使用到的内置库就是os库,没有通过其他的三方插件进行实现.所以也不用下载其他的python模块,直接调用内置库就OK了. import os 因为我们使用界面化的处理,这里导入一下pyqt5的

  • Flutter自动路由插件auto_route使用详解

    目录 一.简介 二.基本使用 2.1 安装插件 2.2 定义路由表 2.3 生成路由 2.4 路由跳转 2.5 处理返回结果 三.路由导航 3.1 嵌套导航 3.2 Tab 导航 3.3 PageView 3.4 声明式导航 四.高级用法 4.1 路由控制器 4.2 Paths 4.2.1 Path Parameters 4.2.2 Inherited Path Parameters 4.2.3 Query Parameters 4.2.4 Redirecting Paths 4.3 路由守护

  • spring boot集成smart-doc自动生成接口文档详解

    目录 前言 功能特性 1 项目中创建 /src/main/resources/smart-doc.json配置文件 2 配置内容如下(指定文档的输出路径) 3 pom.xml下添加配置 4 运行插件 5 找到存放路径浏览器打开 6 测试结果 前言 smart-doc 是一款同时支持 java restful api 和 Apache Dubbo rpc 接口文档生成的工具,smart-doc 颠覆了传统类似 swagger 这种大量采用注解侵入来生成文档的实现方法. smart-doc 完全基于

  • Android ListView中动态添加RaidoButton的实例详解

    Android ListView中动态添加RaidoButton的实例详解 这里讲解的内容是:从数据库中取得数据,将这些数据的value值赋值给Radiobutton的text属性,将这些数据的key值赋值给radiobutton的key值.同时实现点击一整行,更换radiobutton选择. XML代码:主要是添加一个ListView控件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&q

  • C#中添加窗口的步骤详解

    C#中添加窗口的步骤:1是添加窗口.2是在程序中使用new实例化窗口类对象,并显示窗口. 1 添加窗口 在解决方案管理器->主项目名称->右键->添加->Windows窗体 2 实例化并显示窗口 //实例化窗口对象Form2 f2 = new Form2();//调用类成员函数Show()来显示窗口f2.Show(); 以上这篇C#中添加窗口的步骤详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 对layui中的onevent 和event的使用详解

    这是官方文档的说明 layui.onevent(modName, events, callback) 自定义模块事件,属于比较高级的应用.有兴趣的同学可以阅读layui.js源码以及form模块 layui.event(modName, events, params) 执行自定义模块事件,搭配onevent使用 参数1我暂时理解为组,定义子级方法和使用event调用都需要注意这个参数必须一致 参数二是定义父级方法名,如果有需要定义该方法的子方法时候同样使用onevent,但参数二的方法名需要与父

  • 对python字典元素的添加与修改方法详解

    1.字典中的键存在时,可以通过字典名+下标的方式访问字典中改键对应的值,若键不存在则会抛出异常.如果想直接向字典中添加元素可以直接用字典名+下标+值的方式添加字典元素,只写键想后期对键赋值这种方式会抛出异常. >>>a=['apple','banana','pear','orange'] >>> a ['apple', 'banana', 'pear', 'orange'] >>> a={1:'apple',2:'banana',3:'pear',4:

随机推荐