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(),
]);
目录
相关文章
|
7月前
|
PHP 调度 容器
Swoole 源码分析之 Coroutine 协程模块
协程又称轻量级线程,但与线程不同的是;协程是用户级线程,不需要操作系统参与。由用户显式控制,可以在需要的时候挂起、或恢复执行。
89 1
Swoole 源码分析之 Coroutine 协程模块
|
8月前
|
存储 Python
python使用gevent库来创建协程,并通过协程实现并发执行不同的任务
```markdown 这段Python代码利用`gevent`库实现并发执行协程。定义了两个打印函数`f1`和`f2`,分别输出"csdn"和"yyds"。代码首先创建列表`t_l`,并启动5个`f1`协程,将其加入列表并等待所有协程完成。随后,同样方式启动5个`f2`协程,存入`t1_l`列表并等待执行完毕。整体展示了`gevent`的协程并发操作。 ```
63 1
|
网络协议 关系型数据库 MySQL
swoole协程框架?
Swoole是一个高性能的PHP扩展,可以用于构建异步、并发和高性能的网络应用。它提供了许多底层网络通信和多进程管理的功能,使得开发者可以更轻松地编写高性能的服务器程序。
108 0
|
安全 Unix Shell
Python 异步: 在非阻塞子进程中运行命令(19)
Python 异步: 在非阻塞子进程中运行命令(19)
909 0
|
Java 调度 Python
一日一技:在Python 的线程中运行协程
一日一技:在Python 的线程中运行协程
187 0
|
调度 开发者 Python
【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
127 0
【Python零基础入门篇 · 24】:协程和IO操作的简单理解、greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
|
程序员 Linux API
python gevent协程模块详解
python gevent协程模块详解
|
消息中间件 Java 调度
协程是如何启动的?
协程是如何启动的?
协程是如何启动的?
|
NoSQL Go 调度
swoole| swoole 协程初体验
通过协程的执行初窥 swoole 中协程的调度; 理解协程为什么快; swoole 协程和 go 协程对比
238 0
swoole| swoole 协程初体验
|
网络协议 关系型数据库 Go
swoole| swoole 协程用法笔记
swoole| swoole 协程用法笔记
896 0