zoukankan      html  css  js  c++  java
  • Swoole学习总结1

    一,Swoole服务三种模式(默认是多进程模式)

    # Base模式(SWOOLE_BASE
    传统的异步非阻塞Server,reactor和worker是同一个角色。TCP连接是在worker进程中维持的。
    如果客户端连接之间不需要交互,可以使用BASE模式。如Memcache、Http服务器等

    # 线程模式
    多线程Worker模式,Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker线程去处理。

    缺点:一个线程发生内存错误,整个进程会全部结束。
    由于PHP的ZendVM在多线程模式存在内存错误,多线程模式在v1.6.0版本后已关闭。

    # 进程模式
    与多线程Worker模式不同的是,线程换成了进程。Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker进程去处理。适合业务逻辑非常复杂的场景。如WebSocket服务器等。


     



    二,进程的关系介绍:

    一个最基础的Swoole Server,至少需要有3个进程,分别是Master进程Manager进程Worker进程



    Master进程是一个多线程进程,其中有一组非常重要的线程,叫做Reactor线程(组),每当一个客户端连接上服务器的时候,都会由Master进程从已有的Reactor线程中,根据一定规则挑选一个,
    专门负责向这个客户端提供维持链接、处理网络IO与收发数据等服务。分包拆包等功能也是在这里完成。


    Manager进程,某种意义上可以看做一个代理层,它本身并不直接处理业务,其主要工作是将Master进程中收到的数据转交给Worker进程,或者将Worker进程中希望发给客户端的数据转交给Master进程进行发送。

    Manager进程还负责监控Worker进程,如果Worker进程因为某些意外挂了,Manager进程会重新拉起新的Worker进程,有点像Supervisor的工作。而这个特性,也是最终实现热重载的核心机制。

    Worker进程其实就是处理各种业务工作的进程,Manager将数据包转交给Worker进程,然后Worker进程进行具体的处理,并根据实际情况将结果反馈给客户端。


    三,编程须知
    编程须知

    1.不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
    2.exit/die是危险的,会导致worker进程退出
    3.可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作,具体参看/wiki/page/305.html
    4.PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
    5.swoole不支持set_exception_handler,必须使用try/catch方式处理异常
    6.Worker进程不得共用同一个Redis或MySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中。原因是如果共用1个连接,那么返回的结果无法保证被哪个进程处理。持有连接的进程理论上都可以对这个连接进行读写,这样数据就发生错乱了。具体参考/wiki/page/325.html
    7. 不能使用类的属性保存客户端连接信息,因为一个worker进程可以处理多个客户端连接,导致类属性数据错乱。常量则是可以的。
     


  • 相关阅读:
    UVALive 7509 Dome and Steles
    HDU 5884 Sort
    Gym 101194H Great Cells
    HDU 5451 Best Solver
    HDU 5883 The Best Path
    HDU 5875 Function
    卡特兰数
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    Spark Scala Flink版本对应关系
  • 原文地址:https://www.cnblogs.com/zhengweizhao/p/8970559.html
Copyright © 2011-2022 走看看