-
Notifications
You must be signed in to change notification settings - Fork 3
Open
Labels
Description
Swoole 底层对于 Socket 操作分成 3 种类型:
同步阻塞
将等待所有 IO 操作完成后返回
异步非阻塞
直接返回,若为 false 表示操作失败,true 表示操作成功,所有 IO 操作会加入 EventLoop 事件循环等待中,由底层异步完成,若出现错误则打印错误日志,不会将最终的结果返回给调用方。
协程
与同步阻塞模式行为一致,调用函数会挂起当前协程,等待所有 IO 操作完成后才会返回。若执行过程中发生了错误,则会立即返回 false
底层在命名中存在风格一致性问题,需要在 6.0.3 版本中改进,实现统一。5.1.x 分支将不进行修改API命名。此修改仅为底层重构,不影响 PHP API。
统一风格
- 所有同步阻塞函数,统一命名为
名称+_sync,不再使用_blocking或_wait等其他后缀 - 所有异步非阻塞函数,统一命名为
名称+_async - 原始的 IO 操作,不加任何后缀,实际行为取决于
Socket的阻塞/非阻塞设置,例如Socket::sendfile()此函数在设置为:1)阻塞模式将等待写操作完成,2)非阻塞模式下若Socket写缓存区已满,则会立即返回失败,并标记错误码errno为EAGAIN,若缓存区容量足够容纳当前写入的数据,则返回成功 - 协程相关,
C API命名必须为swoole_coroutine_前缀,C++ API必须放置于swoole::coroutine::命名空间之内
[3]: 部分
API在有事件循环的环境下是异步行为,无事件循环环境则是同步阻塞,此类API也将遵循第三条约定,不增加任何后缀,例如ProcessPool::dispatch()。所有显式地追加_async或_sync后缀,则表示此函数拥有确定的异步非阻塞或同步阻塞行为,而不需要关心当前所处的环境。例如_sync后缀的函数,即使当前线程存在事件循环,依旧会阻塞地等待IO完成并返回。而_async后缀的函数,若当前线程没有事件循环设施,将会出现错误甚至crash
deminy and jingjingxyk