> For the complete documentation index, see [llms.txt](https://xiaoxiami.gitbook.io/swoole/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaoxiami.gitbook.io/swoole/gai-nian/tong-bu-yi-bu.md).

# 同步 与 异步

建议编程时提前阅读官方文档[异步编程与同步编程的不同之处以及需要注意的事项](https://wiki.swoole.com/wiki/page/498.html)章节

swoole是既支持全异步，也支持同步，同步跟异步的概念，我们需要了解

同步与异步的重点在消息通知的方式上，也就是调用结果通知的方式。

同步: 当一个同步调用发出去后，调用者要一直等待调用结果的通知后，才能进行后续的执行。

异步：当一个异步调用发出去后，调用者不能立即得到调用结果的返回。

生活中的例子：

同步买奶茶：小明点单交钱，然后等着拿奶茶；

异步买奶茶：小明点单交钱，店员给小明一个小票，等小明奶茶做好了，再来取。

## 异步的优势

* 高并发，同步阻塞IO模型的并发能力依赖于进程/线程数量，例如`php-fpm`开启了200个进程，理论上最大支持的并发能力为200。如果每个请求平均需要100ms，那么应用程序就可以提供2000qps。异步非阻塞的并发能力几乎是无限的，可以发起或维持大量并发TCP连接
* 无IO等待，同步模型无法解决`IOWait`很高的场景，如上述例子每个请求平均要10s，那么应用程序就只能提供20qps了。而异步程序不存在IO等待，所以无论请求要花费多长时间，对整个程序的处理能力没有任何影响

## 同步的优势

* 编码简单，同步模式编写/调试程序更轻松
* 可控性好，同步模式的程序具有良好的过载保护机制，如在下面的情况异步程序就会出问题
* Accept保护，同步模式下一个TCP服务器最大能接受`进程数+Backlog`个TCP连接。一旦超过此数量，Server将无法再接受连接，客户端会连接失败。避免服务器Accept太多连接，导致请求堆积
