• Swoole 中协程的使用注意事项及协程中的异常捕获


    协程使用注意事项

    • 协程内部禁止使用全局变量,以免发生数据错乱;
    • 协程使用 use 关键字引入外部变量到当前作用域禁止使用引用,以免发生数据错乱;
    • 不能使用类静态变量 Class::$array / 全局变量 $_array / 全局对象属性 $object->array / 其他超全局变量 $GLOBALS 等保存协程上下文内容,以免发生数据错乱;
    • 协程之间通讯必须使用通道(Channel);
    • 不能在多个协程间共用一个客户端连接,以免发生数据错乱;可以使用连接池实现;
    • 在 SwooleServer 中,客户端连接应当在 onWorkerStart 中创建;
    • 在 SwooleProcess 中,客户端连接应当在 SwooleProcess->start 后,子进程的回调函数中创建;
    • 必须在协程内捕获异常,不得跨协程捕获异常;
    • __get / __set 魔术方法中不能有协程切换。

    协程中的异常捕获

    示例一:协程中使用exit函数抛出 ExitException 异常

    function route()
    {
        controller();
    }
    
    function controller()
    {
        your_code();
    }
    
    function your_code()
    {
        co::sleep(.001);
        exit(1);
    }
    
    go(function () {
        try {
            route();
        } catch (SwooleExitException $e) {
            var_dump($e->getMessage());
            var_dump($e->getStatus() === 1);
            var_dump($e->getFlags());
        }
    });
    

    示例二:协程中使用exit函数抛出 ExitException 异常

    $exit_status = 0;
    go(function () {
        try {
            exit(123);
        } catch (SwooleExitException $e) {
            global $exit_status;
            $exit_status = $e->getStatus();
        }
    });
    swoole_event_wait();
    var_dump($exit_status);
    

    示例三:协程中直接抛出 RuntimeException 异常

    function test() {
        throw new RuntimeException(__FILE__, __LINE__);
    }
    
    SwooleCoroutine::create(function () {
        try {
            test();
        }
        catch (Throwable $e) {
            echo $e;
        }
    });
    
  • 相关阅读:
    webpack学习(一)—— 入门
    AMD 规范
    CommonJS 规范
    webpack 故障处理
    webpack 开发环境
    webpack 插件
    webpack 配置文件
    webpack 使用
    webpack Loader
    webpack常用的插件安装命令
  • 原文地址:https://www.cnblogs.com/danhuang/p/13289285.html
Copyright © 2020-2023  润新知