hyperf命令行与协程

简介: hyperf命令行与协程

hyperf命令行与协程


背景


需要自定义命令行Command 启动附属的Server服务


记录一下引发的几个问题


无法启动


产生报错


Swoole\Server::start(): eventLoop has already been created, unable to start Swoole\Server


原因:Command中已经开启了协程无法再监听server


Co::create(function(){
    $server = new Server('0.0.0.0', 9501, SWOOLE_BASE, SWOOLE_SOCK_TCP);
    $server->start();
});


处理方案,在Command类中定义属性,关闭协程


class StartCommand extends HyperfCommand
{
    /**
     * Execution in a coroutine environment.
     */
    protected $coroutine = false;
    // .....
}


关闭协程后的问题


查看hyperf-command组件代码 核心如下


if ($this->coroutine && ! Coroutine::inCoroutine()) {
    run($callback, $this->hookFlags);
    return $this->exitCode;
}
return $callback();


开启了协程之后会传递hookFlags参数


在关闭协程之后 一些心跳函数里我写了如下代码


Coroutine::create(function(){
    while(true){
        // foreach send 
        \Hyperf\Utils\Coroutine::sleep(3);
    }
});


但是由于默认没有hook了,而Hyperf utils中使用的不是Swoole提供的sleep函数,所以会造成进程堵塞。导致其他逻辑无法运行。


解决方案:在server set里设置hook


$server->set([
    'worker_num' => 2,
    'daemonize' => $daemon,
    'enable_coroutine' => true,
    'hook_flags' => swoole_hook_flags(),
]);
目录
相关文章
|
C# Python
[√]lua 协程
[√]lua 协程
72 1
Ansible-playbook 并发运行async、poll(学习笔记二十二)
ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行.那如果你有大量的机器需要控制,或者你希望减少进程数,那你可以采取异步执行.ansible的模块可以把task放进后台,然后轮询它.
4712 0
|
3月前
|
存储 Go UED
精通Go语言的命令行参数解析
【8月更文挑战第31天】
44 0
|
5月前
|
PHP 调度 容器
Swoole 源码分析之 Coroutine 协程模块
协程又称轻量级线程,但与线程不同的是;协程是用户级线程,不需要操作系统参与。由用户显式控制,可以在需要的时候挂起、或恢复执行。
78 1
Swoole 源码分析之 Coroutine 协程模块
|
6月前
|
调度 Python
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
77 0
|
网络协议 关系型数据库 MySQL
swoole协程框架?
Swoole是一个高性能的PHP扩展,可以用于构建异步、并发和高性能的网络应用。它提供了许多底层网络通信和多进程管理的功能,使得开发者可以更轻松地编写高性能的服务器程序。
98 0
|
调度 开发者 Python
【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
118 0
【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
|
网络协议 前端开发 NoSQL
workerman的基本用法(二)
workerman的基本用法(二)
265 0
workerman的基本用法(二)
|
消息中间件 Java 调度
协程是如何启动的?
协程是如何启动的?
协程是如何启动的?