Swoole下TCP协程服务器和TCP异步服务器理解

在Swoole中,TCP协程服务器(Coroutine TCP Server)和TCP异步服务器(Async TCP Server)都是高并发服务器的实现方式,它们各有优缺点。

对比项 协程TCP服务器 异步TCP服务器
协程支持 自动化协程(基于enable_coroutine) 手动回调(基于事件回调机制)
代码风格 代码同步风格,像普通PHP一样 代码异步风格,回调嵌套太多
易用性 简单直观,容易上手 复杂,需要处理回调和异步逻辑
性能 高并发下有协程调度开销 适合极高并发,少量Worker处理大量连接
I/O处理方式 自动Hook fread/fwrite,I/O非阻塞 事件驱动,基于onReceive回调处理数据
适用场景 适用于中高并发,需要易读代码的业务(如游戏,业务逻辑复杂的TCP服务) 适用于极高并发(如网关,代理,聊天室,消息推送)

1.协程TCP服务器

 协程TCP服务器是基于Swoole协程模型的服务器,它能够在处理多个连接时自动切换上下文,避免了传统的阻塞和线程调度问题。每当一个连接需要等待I/O操作时,协程会将当前任务挂起,然后调度其他协程去处理其他任务,这样能极大提高并发能力。

协程TCP服务器特定:

每个连接都在独立的协程中:每个连接的处理都可以在独立的协程中进行,协程会自动化进行上下文切换。

使用Co\run()启动协程环境:所有的协程都在Co\run()内部运行,避免了阻塞。

I/O操作是非阻塞的:recv(),send()等操作都经过协程调度。

示例:

<?php
use Swoole\Coroutine\Server\Connection;
 
 
Co\run(function(){
    $server = new Swoole\Coroutine\Server('0.0.0.0',9501);
    $server->handle(function(Connection $conn){
        while(true){
    
            $data = $conn->recv(10);
            var_dump($data);
            $conn->send('hi');
    
        }
    });
    echo "协程 TCP 服务器启动在 9501 端口...\n";
    
    $server->start(); 
});

 2.异步TCP服务器

异步TCP服务器使用事件驱动模型,它通过事件循环不断监测I/O事件并在需要时触发回调函数。与协程不同的是,异步服务器并不会为每个连接创建独立的协程,而是利用事件循环的机制,通过回调函数处理每个连接的读写。

异步TCP服务器特定:

 单线程多进程或单线程:异步服务器通常在单线程中处理所有连接,通过事件循环调度I/O操作。

事件驱动回调:异步TCP服务器通过注册回调函数来处理每个连接,当I/O事件发生时,回调函数被触发。

不涉及协程:不会创建协程,不会涉及上下文切换,I/O操作是基于事件驱动的。

示例:

<?php


$server = new Swoole\Server('0.0.0.0',9501);
$server->on('Connect',function(){

});
$server->on('Receive',function($server,$fd,$reactor_id,$data){
    var_dump($data);

    $server->send($fd,'this is xx');
});
$server->on('Close',function(){

});
$server->start();

协程TCP服务器与异步TCP服务器的对比

特性 协程TCP服务器 异步TCP服务器
编程模型 基于协程,支持协程内的上下文切换 基于事件循环,回调函数处理每个连接
并发性 每个连接在独立的协程中处理,支持高并发 依赖事件驱动,通过回调函数处理并发
代码简洁性 每个协程像同步代码一样编写,简化了异步代码复杂度 需要显示注册时间和回调函数,代码复杂度较高
性能 性能好,支持高并发,且协程的调度开销小 性能也很好,但回调函数可能导致一定的延迟
上下文切换 自动切换协程,轻量级上下文切换 不涉及协程的上下文切换,事件驱动处理数据

 

posted @ 2025-04-03 10:21  X__cicada  阅读(34)  评论(0)    收藏  举报