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对象
Coroutine\Channel
Coroutine\Client
Coroutine\Http\Client
Coroutine\Http2\Client
Coroutine\Redis
Coroutine\Socket
Coroutine\MySQL
Coroutine\PostgreSQL
这些Coroutine只适合在一个进程中做处理. 例如你需要在一个onRequest方法里, 同时请求多个mysql和redis, 那么使用Coroutine可以使这些请求并行, 达到节约网络时间的目的.
Coroutine不适合在Server中创建, 又需要在多个进程中处理的场景, 例如你在server里创建了一个socket, 希望在各个worker里面调用.
PHP异步扩展Swoole笔记(2)的更多相关文章
- PHP异步扩展Swoole笔记(1)
安装Swoole扩展 通过pecl安装, 系统中最好已经有http2依赖, 如果是Ubuntu, 可以直接通过apt安装nghttp2, 如果是Centos或者需要自己编译, 在Github下载ngh ...
- 编译安装PHP7并安装Redis扩展Swoole扩展
编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- 编译安装PHP7并安装Redis扩展Swoole扩展(未实验)
用PECL自动安装Redis扩展.Swoole扩展 pecl install redis pecl install swool 编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机 ...
- PHP 的异步并行 C 扩展 Swoole
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- PHP 的异步并行和协程 C 扩展 Swoole (附链接)
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- 安装swoole redis异步 hiredis swoole扩展加载失败 或者不显示问题 解决办法
当前办法仅供参考 贴上报错 找了好久 根据网上办法也试了 没解决 最后 仔细读问题 觉得可能是 hiredis路径问题 终于解决了 解决办法: 进入你的安装包目录然后执行下面 mkdir /usr/l ...
- Mac Pro 编译安装 PHP扩展 -- Swoole扩展
回顾下先前的安装笔记: PHP5不重新编译,如何安装自带的未安装过的扩展,如soap扩展? #下载 Swoole-1.8.10后,开始编译# cd /Users/jianbao/Downloads/s ...
- 《C#并行编程高级教程》第9章 异步编程模型 笔记
这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类. 但是出于完整性,还是将一下怎么使用. ...
随机推荐
- Dev-C++安装第三方库boost
Dev-C++安装第三方库boost 转 https://www.jianshu.com/p/111571e4d6f5?utm_source=oschina-app 之前鉴于codeblocks界面 ...
- P2280 [HNOI2003]激光炸弹(二维前缀和)
题目描述 一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标.现在地图上有n(n≤10000)个目标,用整数xi,yi(0≤xi,yi≤5000)表示目标在地图上的位置,每个目标都有一个价 ...
- HDU 5536 Chip Factory (暴力+01字典树)
<题目链接> 题目大意: 给定一个数字序列,让你从中找出三个不同的数,从而求出:$\max_{i,j,k} (s_i+s_j) \oplus s_k$的值. 解题分析:先建好01字典树,然 ...
- Django之视图函数总结
Django之视图函数总结 HttpRequest与HttpResponse http请求中产生两个核心对象: HttpRequest对象:用户请求相关的所有信息(对象) HttpResponse对象 ...
- BZOJ.5251.[八省联考2018]劈配mentor(最大流)
BZOJ 洛谷 对于每个人,每次枚举一个志愿看是否能增广即可. 对于第二问,可以保留第一问中\(n\)次增广前后的\(n\)张图,二分,在对应图上看是否能增广即可. 貌似匈牙利的某种写法比网络流优多了 ...
- 洛谷.3805.[模板]manacher算法
题目链接 之前做很早了没写这篇,补上. 记录当前ex[]最大的回文中心id和最远延伸范围mx! 关于串的构造: 应该是 @ #A#B#C#B#A# $ ,而不是 @ A#B#C#B#A $ 比如 @a ...
- 2017-9-8-李明Linux:Linux应用与发展
1965年,MIT.通用电气&贝尔实验室联合开发分时操作系统Multics,没有项目管理概念和追求目标过于庞大导致项目失败:1969年,参加过该项目的贝尔实验室成员肯 ·汤普森对自己开发的游戏 ...
- 英语口语练习系列-C26-广告-人际关系-辨别物体-如果
词汇-广告 advertisement noun [ C ] UK /ədˈvɜː.tɪs.mənt/ US /æd.vɝːˈtaɪz.mənt/ informal ad, uk also infor ...
- mongoose事务操作,参考官网
https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/ await model.photo.bulkWrit ...
- TFS Release 步骤调用命令行返回失败信息的处理方法
TFS Release中自定义步骤时,可以选择“命令行”,官方的文档中,并没有描述调用相关的程序后,如何返回失败信息.通过下面步骤,可以实现本标题描述的功能. 步骤一:编写Console Applic ...