首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
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不会进行协程让出 } }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 协程等待时不影响信号的异步监听, 信号可以立即被触发。
发布于5年前 · 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
回复