swoole学习

Swoole的一些特点:

  • Accept线程,解决Accept性能瓶颈和惊群问题
  • 多IO线程,可以更好地利用多核
  • 提供了全异步和半同步半异步2种模式
  • 处理高并发IO的部分用异步模式
  • 复杂的业务逻辑部分用同步模式
  • 底层支持了遍历所有连接、互发数据、自动合并拆分数据包、数据发送原子性。

Swoole的进程/线程模型:

Swoole程序的执行流程

 

同步&异步&阻塞&非阻塞区别

1 (1)同步:在服务端我们通常用一个TcpListener来监听一个IP和端口。客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收。比如:

TcpListene server = new TcpListener(IPAddress.Parse("127.0.0.1"), port);

TcpClient tc =server.AcceptTcpClient();

  这里就一个同步接收的方式,那为什么说同步呢,因为在这个端口下如果同是来了两个客户端请求,第一个连接得到响应,与服务端建立通讯,而第二个请求就会被一直阻塞直到第一个请求完成操作,各个请求之间就好像排个队,顺序执行,这就是同步。

 2 (2)异步呢,就是同时来两个或者多个请求,服务端就同时响应多个客户端,同时给他们连接。各个客户端与服务器的通讯是并行的,一个客户端不必等另一个客户端完成操作。通常用这两个方法来接收一个客户端请求。

BeginAcceptTcpClient()

EndAcceptTcpClient()

 3 (3)阻塞 调用是指调用结果返回之前,当前线程会被挂起。比如:Console.ReadLine(),如果你不向控制台输入数据,这个方法就会一直等待,知道你输入数据后才会向下执行。这个时候当前线程被挂起来了,让CPU去做其他事情。

 4 (4)非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回

使用PHP+Swoole扩展实现异步通信编程

异步TCP服务器:

<?php
    $serv =  new swoole_server("0.0.0.0",9501);
    //设置异步工作进程
    $serv->set(['task_worker_num'=>4]);
    //投递异步任务
    $serv->on("receive",function($serv,$fd,$from_id,$data){
        $task_id = $serv->task($data);
        echo "异步任务投递成功".PHP_EOL;
    });
    //处理异步任务
    $serv->on("task",function($serv,$task_id,$from_id,$data){
        echo "处理投递异步任务".PHP_EOL;
        $serv->finish();
    });
    $serv->on('finish',function(){
        echo "任务完成".PHP_EOL;
    });

  $serv->start();
?>
原文地址:https://www.cnblogs.com/zh718594493/p/12248904.html