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
|
5月前
|
PHP 调度 容器
Swoole 源码分析之 Coroutine 协程模块
协程又称轻量级线程,但与线程不同的是;协程是用户级线程,不需要操作系统参与。由用户显式控制,可以在需要的时候挂起、或恢复执行。
81 1
Swoole 源码分析之 Coroutine 协程模块
|
6月前
|
存储 Python
python使用gevent库来创建协程,并通过协程实现并发执行不同的任务
```markdown 这段Python代码利用`gevent`库实现并发执行协程。定义了两个打印函数`f1`和`f2`,分别输出"csdn"和"yyds"。代码首先创建列表`t_l`,并启动5个`f1`协程,将其加入列表并等待所有协程完成。随后,同样方式启动5个`f2`协程,存入`t1_l`列表并等待执行完毕。整体展示了`gevent`的协程并发操作。 ```
57 1
|
6月前
|
调度 Python
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
80 0
|
6月前
|
程序员 Linux 调度
用ucontext库创建简单的协程
用ucontext库创建简单的协程
125 0
|
11月前
|
Go 调度 C#
Unity——协程(Coroutine)
Unity——协程(Coroutine)
319 0
|
网络协议 关系型数据库 MySQL
swoole协程框架?
Swoole是一个高性能的PHP扩展,可以用于构建异步、并发和高性能的网络应用。它提供了许多底层网络通信和多进程管理的功能,使得开发者可以更轻松地编写高性能的服务器程序。
99 0
|
调度 Python
Python3的原生协程(Async/Await)和Tornado异步非阻塞
我们知道在程序在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞,而协程作为一种用户态的轻量级线程,可以帮我们解决这个问题。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存,在调度回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态,即所有局部状态的一个特定组合
Python3的原生协程(Async/Await)和Tornado异步非阻塞
|
网络协议 PHP
Swoole 中通过 process 模块实现多进程
Swoole 中通过 process 模块实现多进程
209 0
Swoole 中通过 process 模块实现多进程