zoukankan      html  css  js  c++  java
  • PHP异步扩展Swoole笔记(2)

    dispatch_mode, 数据包分发策略

    可以选择7种类型,默认为2
    1,轮循模式,收到会轮循分配给每一个Worker进程
    2,固定模式,根据连接的文件描述符分配Worker。这样可以保证同一个连接发来的数据只会被同一个Worker处理
    3,抢占模式,主进程会根据Worker的忙闲状态选择投递,只会投递给处于闲置状态的Worker
    4,IP分配,根据客户端IP进行取模hash,分配给一个固定的Worker进程。可以保证同一个来源IP的连接数据总会被分配到同一个Worker进程。算法为 ip2long(ClientIP) % worker_num
    5,UID分配,需要用户代码中调用 Server->bind() 将一个连接绑定1个uid。然后底层根据UID的值分配到不同的Worker进程。算法为 UID % worker_num,如果需要使用字符串作为UID,可以使用crc32(UID_STRING)
    7,stream模式,空闲的Worker会accept连接,并接受Reactor的新请求

    使用建议

    无状态Server可以使用1或3,同步阻塞Server使用3,异步非阻塞Server使用1, 有状态使用2、4、5
    dispatch_mode 4,5两种模式,在1.7.8以上版本可用
    dispatch_mode=1/3时,底层会屏蔽onConnect/onClose事件,原因是这2种模式下无法保证onConnect/onClose/onReceive的顺序, 非请求响应式的服务器程序,请不要使用模式1或3

    UDP协议

    dispatch_mode=2/4/5时为固定分配,底层使用客户端IP取模散列到不同的Worker进程,算法为 ip2long(ClientIP) % worker_num
    dispatch_mode=1/3时随机分配到不同的Worker进程

    BASE模式

    dispatch_mode配置在BASE模式是无效的,因为BASE不存在投递任务,当Reactor线程收到客户端发来的数据后会立即在当前线程/进程回调onReceive,不需要投递Worker进程。

    Lock

    Lock用来实现数据同步, Lock类支持5种锁的类型

    • 文件锁 SWOOLE_FILELOCK
    • 读写锁 SWOOLE_RWLOCK
    • 信号量 SWOOLE_SEM
    • 互斥锁 SWOOLE_MUTEX
    • 自旋锁 SWOOLE_SPINLOCK

    注意:勿在onReceive等回调函数中创建锁, 否则底层的GlobalMemory内存会持续增长, 造成内存泄漏

    swoole_lock->__construct(int $type, [string $lockfile])
    $type为锁的类型
    $lockfile, 当类型为SWOOLE_FILELOCK时必须传入, 指定文件锁的路径
    注意每一种类型的锁支持的方法都不一样。如读写锁、文件锁可以支持$lock->lock_read()。另外除文件锁外, 其他类型的锁必须在父进程内创建, 这样fork出的子进程之间才可以互相争抢锁。不要循环创建/销毁锁的对象, 否则会发生内存泄漏

    swoole_lock->lock()
    加锁操作。如果有其他进程持有锁, 那这里将进入阻塞, 直到持有锁的进程unlock. 加锁成功返回true

    swoole_lock->trylock()
    加锁操作。与lock方法不同的是, trylock()不会阻塞, 它会立即返回。
    加锁成功返回true, 此时可以修改共享变量
    加锁失败返回false, 表示有其他进程持有锁

    swoole_lock->unlock()
    解锁成功返回true

    swoole_lock->lock_read()
    仅锁定读. 在持有读锁的过程中, 其他进程依然可以获得读锁, 可以继续发生读操作, 但不能$lock->lock()或$lock->trylock(), 这两个方法是获取独占锁, 在独占锁加锁时, 其他进程无法再进行任何加锁操作, 包括读锁.
    当另外一个进程获得了独占锁(调用$lock->lock/$lock->trylock)时, $lock->lock_read()会发生阻塞, 直到持有独占锁的进程释放锁
    只有SWOOLE_RWLOCK和SWOOLE_FILELOCK类型的锁支持只读加锁

    swoole_lock->trylock_read()
    此方法与lock_read相同, 但是非阻塞的

    swoole_lock->lockwait(float $timeout = 1.0) : bool;
    加锁操作,作用与swoole_lock->lock一致,但lockwait可以设置超时时间。
    $timeout传入超时时间,默认为1秒, 在规定的时间内未获得锁,返回false, 加锁成功返回true
    只有Mutex类型的锁支持lockwait

    Coroutine 协程

    Swoole提供了以下的Coroutine对象

    CoroutineChannel
    CoroutineClient
    CoroutineHttpClient
    CoroutineHttp2Client
    CoroutineRedis
    CoroutineSocket
    CoroutineMySQL
    CoroutinePostgreSQL

    这些Coroutine只适合在一个进程中做处理. 例如你需要在一个onRequest方法里, 同时请求多个mysql和redis, 那么使用Coroutine可以使这些请求并行, 达到节约网络时间的目的.
    Coroutine不适合在Server中创建, 又需要在多个进程中处理的场景, 例如你在server里创建了一个socket, 希望在各个worker里面调用.

  • 相关阅读:
    拓端数据|R语言乘法GARCH模型对高频交易数据进行波动性预测
    拓端数据|Python中用Prophet模型对天气时间序列进行预测与异常检测
    拓端数据|R语言:状态空间模型和卡尔曼滤波预测酒精死亡人数时间序列
    拓端数据|R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测
    拓端数据|数据挖掘:香水电商销售策略分析
    UOJ#523. 【美团杯2020】半前缀计数 后缀自动机
    LuoguP6688 可重集 线段树+hash
    LuoguP6687 论如何玩转 Excel 表格 树状数组
    LOJ#2303. 「NOI2017」蚯蚓排队 hash+链表
    LOJ#6289. 花朵 树链剖分+分治NTT
  • 原文地址:https://www.cnblogs.com/milton/p/10369733.html
Copyright © 2011-2022 走看看