当前位置: 首页 > 编程笔记 >

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

太叔逸春
2023-03-14
本文向大家介绍Swoole 5将移除自动添加Event::wait()特性详解,包括了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();

不推荐使用

总结

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

 类似资料:
  • 我有一个窗口窗体有一个按钮,当按钮被点击时,它动态生成控件,也有一个按钮被添加,这样它就会删除在行的控件,意味着在按钮旁边,当按钮被点击时,一行控件将被删除。我的代码是 我的错误是什么,但问题是它dosnt删除所有的控件,它留下控件,我不知道什么问题,我的代码简单容易,但我不知道哪里缺乏

  • 本文向大家介绍详解原生JS动态添加和删除类,包括了详解原生JS动态添加和删除类的使用技巧和注意事项,需要的朋友参考一下 由于需要, 给按钮组监听点击事件(要求用事件委托),当有一个按钮被点击时,相应的给该按钮添加一个类(激活类),其他没有点击的按钮就要移出该类 添加和和删除类有三种方法 首先等到一个 dom 对象(也叫dom元素), 通过document.getElement……的几种方法得到 如

  • 本文向大家介绍详解前端自动化工具gulp自动添加版本号,包括了详解前端自动化工具gulp自动添加版本号的使用技巧和注意事项,需要的朋友参考一下 之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时在更新css或js时老是在客户端存在缓存导致更新后的效果

  • 好好信任你们。 我的web应用程序运行在tomcat 6.0.43上,不使用apache或nginx。 我已经强制我的网络从超文本传输协议重定向到https使用: URL重定向到/webapps/ROOT/index。jsp

  • 我有几个spring boot应用程序,我想在其中放置一个自定义注释(在一些bean中)。注释将有一个字段(例如propertyValue)。我希望将该值作为新PropertySource的一部分添加到环境中。 我的想法是创建一个将注入环境的bean,然后向其中添加一个新的PropertySource。缺少的部分是如何将自定义注释与这个bean连接起来。 有什么想法吗?

  • 除了通过"allAutoDetected"权限让Chrome应用自动查找媒体库外,也可以让用户手动添加或者移除媒体库。 在上一节中我们调用getMediaFileSystems方法时,将其参数中的interactive指定为了if_needed,如果将其指定为yes则会出现一个弹出让用户选择保留的媒体库或者添加其他媒体库: 媒体库选择弹窗 如果只想单纯提供添加其他位置的功能,可以使用addUser