首页 > php框架 > Swoole > 正文

Swoole如何在一个Worker进程中创建多个协程

下次还敢
发布: 2025-09-26 20:51:03
原创
580人浏览过
Swoole的Worker进程通过协程模式实现高并发,每个Worker可自动运行多个协程,无需手动创建。启用enable_coroutine后,每个请求由独立协程处理,使用go()可在单个Worker内并发执行多个任务,如并发HTTP请求,结合Chan进行协程通信,提升性能。协程为用户态轻量线程,单Worker可支持数万协程,但需避免无节制创建,防止内存耗尽,应使用协程安全API并合理控制资源。

swoole如何在一个worker进程中创建多个协程

Swoole 中的 Worker 进程可以运行多个协程,这是其高并发能力的核心机制之一。你不需要手动“创建多个协程”来提升性能,而是通过开启协程模式后,在一个 Worker 进程中自动支持同时运行多个协程,由 Swoole 调度器进行管理。

启用协程环境

要在一个 Worker 进程中使用多个协程,首先要确保 Swoole 运行在协程模式下。常见的服务器如 Http ServerTCP Server 默认在启用协程风格后会自动为每个请求创建协程。

注意:不要混淆“多进程”和“多协程”——每个 Worker 是单进程,但可承载成百上千个协程。

示例:启动一个支持协程的 HTTP 服务

$http = new Swoole\Http\Server("127.0.0.1", 9501);
$http->set([
    'worker_num' => 1, // 只用一个 Worker 进程测试
    'enable_coroutine' => true,
]);

$http->on('request', function ($request, $response) {
    // 每个请求都在独立协程中执行
    go(function () use ($response) {
        echo "协程开始\n";
        co::sleep(1); // 模拟异步等待
        echo "协程结束\n";
        $response->end("Hello from coroutine");
    });
});

$http->start();
登录后复制

在同一个 Worker 中主动创建多个协程

你可以在任意协程或回调中使用 go() 函数启动新的协程,这些协程都会运行在当前 Worker 进程内,并发执行。

立即进入豆包AI人工智官网入口”;

立即学习豆包AI人工智能在线问答入口”;

例如,在一个请求中并发处理多个任务:

$http->on('request', function ($request, $response) {
    $data = [];
    $chan = new Chan(2);

    go(function () use ($chan) {
        $cli = new Co\Http\Client("httpbin.org", 80);
        $cli->get("/delay/2");
        $chan->push(['url' => 'httpbin', 'data' => $cli->body]);
    });

    go(function () use ($chan) {
        $cli = new Co\Http\Client("httpbin.org", 80);
        $cli->get("/get");
        $chan->push(['url' => 'get', 'data' => $cli->body]);
    });

    // 接收两个结果
    $data['result1'] = $chan->pop();
    $data['result2'] = $chan->pop();

    $response->end(json_encode($data));
});
登录后复制

上面代码中,虽然只有一个 Worker 进程,但在一次请求中通过 go() 创建了两个协程,并发发起 HTTP 请求,显著提升了响应速度。

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程483
查看详情 豆包AI编程

协程调度与资源控制

Swoole 协程是用户态轻量级线程,开销极小,单个 Worker 可轻松支持数万个协程。但也要注意避免无限制创建导致内存耗尽。

  • 使用 ChanWaitGroup 同步协程间通信
  • 合理设置最大协程数(可通过监控 memory_usage 控制)
  • 避免在协程中做同步阻塞操作(如 file_get_contents),应使用 Swoole 提供的协程版 API

比如使用 Co\run() 批量创建协程:

Co\run(function () {
    for ($i = 0; $i < 100; $i++) {
        go(function () use ($i) {
            echo "协程 $i 正在运行\n";
            Co::sleep(0.1);
            echo "协程 $i 结束\n";
        });
    }
});
登录后复制

这会在当前 Worker 中并发运行 100 个协程,全部由 Swoole 自动调度。

基本上就这些。只要启用了协程模式,你就可以在任意位置调用 go() 来创建协程,Swoole 会自动在当前 Worker 内管理它们的生命周期和调度。不复杂但容易忽略的是:确保所有 IO 操作都使用协程兼容的 API,否则会阻塞整个进程。

以上就是Swoole如何在一个Worker进程中创建多个协程的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号