首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
协程代码会阻塞 pcntl_signal 的异步信号监听
### 问题描述 当在协程中使用pcntl_signal 配合pcntl_async_signals(true)进行异步监听信号的时候,信号不会立即返回会在协程恢复时被触发。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 版本 4.6.2 php 版本 7.3.27 ### 相关代码 ```php <?php //使用以下代码异步信号监听会被阻塞,阻塞时间为协程sleep等待时间 use Swoole\Runtime; use function Co\run; //设置异步信号监听 pcntl_async_signals(true); Runtime::enableCoroutine(true);//打开一键协程化 run(function() { pcntl_signal(10,function (){ echo '收到信号...'; },false); var_dump(getmypid()); while (true){ sleep(3);//此时sleep会让出协程 } }); ``` ```php <?php //使用以下代码异步信号监听不会被阻塞,会立即返回 use Swoole\Runtime; use function Co\run; //设置异步信号监听 pcntl_async_signals(true); Runtime::enableCoroutine(false);//关闭一键协程化 run(function() { pcntl_signal(10,function (){ echo '收到信号...'; },false); var_dump(getmypid()); while (true){ sleep(3);//此时sleep不会进行协程让出 } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 协程等待时不影响信号的异步监听, 信号可以立即被触发。
发布于3年前 · 3 次浏览 · 来自
提问
云天001
### 问题描述 当在协程中使用pcntl_signal 配合pcntl_async_signals(true)进行异步监听信号的时候,信号不会立即返回会在协程恢复时被触发。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 版本 4.6.2 php 版本 7.3.27 ### 相关代码 ```php <?php //使用以下代码异步信号监听会被阻塞,阻塞时间为协程sleep等待时间 use Swoole\Runtime; use function Co\run; //设置异步信号监听 pcntl_async_signals(true); Runtime::enableCoroutine(true);//打开一键协程化 run(function() { pcntl_signal(10,function (){ echo '收到信号...'; },false); var_dump(getmypid()); while (true){ sleep(3);//此时sleep会让出协程 } }); ``` ```php <?php //使用以下代码异步信号监听不会被阻塞,会立即返回 use Swoole\Runtime; use function Co\run; //设置异步信号监听 pcntl_async_signals(true); Runtime::enableCoroutine(false);//关闭一键协程化 run(function() { pcntl_signal(10,function (){ echo '收到信号...'; },false); var_dump(getmypid()); while (true){ sleep(3);//此时sleep不会进行协程让出 } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 协程等待时不影响信号的异步监听, 信号可以立即被触发。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2021-03-18
鲁飞
https://wiki.swoole.com/#/coroutine/system?id=waitsignal ```php use Swoole\Runtime; use function Co\run; //设置异步信号监听 Runtime::enableCoroutine(true);//关闭一键协程化 run(function() { go(function () { $bool = Swoole\Coroutine\System::waitSignal(10); var_dump($bool); }); // pcntl_signal(10,function (){ // echo '收到信号...'; // },false); var_dump(getmypid()); while (true){ sleep(3); } }); ```
赞
0
回复
2021-03-18
云天001
回复
鲁飞
用协程的信号监听会遵循协程调度原则,如果是其他协程不出让协程状态是阻塞语句不是IO调度,不会触发信号。 我用异步信号的原因就是想,能立即触发信号。但是遇到阻塞代码不会影响信号触发,但是协程等待会影响。
赞
0
回复
微信公众号
热门内容
作者其它话题
- 定时任务里面如果有异常错误或退出 会被执行两次定时,并且如果在定时里面的添加的中断捕获,第二次报错时才能进入中断捕获
- 如何在父协程或兄弟协程中杀死特定协程
- 主进程和子进程之间如何传递文件描述符或者socket客户端
- 进程池 或者进程管理器中 如何对主进程设置信号监听
- 当swoole\Event 进行信号监听和 文件描述符监听时,信号监听无法触发,
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。