AsyncIO
swoole1.6.12后增加了异步文件读写,异步DNS等特性。自此建立了完整的异步并行API。
- swoole_server的
Task进程
是同步阻塞的,没有EventLoop
,因此无法使除定时器之外的用任何异步IO - signalfd是Linux2.6.27提供文件句柄方式处理信号特性,优点是可以将信号加入到EventLoop中,Reactor操作不会被信号打断提高了性能。缺点是有些同步阻塞的程序可能会出现问题,无法从阻塞中中断,可以使用
swoole_async_set
关闭signalfd
特性
swoole_async_set
此函数可以设置异步IO相关的选项。
swoole_async_set(array $setting);
- thread_num 设置异步文件IO线程的数量
- aio_mode 设置异步文件IO的操作模式,目前支持
SWOOLE_AIO_BASE
(使用类似于Node.js的线程池同步阻塞模拟异步)、SWOOLE_AIO_GCC
(glibc提供的异步文件读写接口)、SWOOLE_AIO_LINUX
(Linux Native AIO) 3种模式 - enable_signalfd 开启和关闭signalfd特性的使用
- socket_buffer_size 设置SOCKET内存缓存区尺寸
- socket_dontwait 在内存缓存区已满的情况下禁止底层阻塞等待
Linux Native AIO的优点是由内核支持是真正的异步文件IO,缺点是只支持DirectIO,无法利用到系统的PageCache
for($i=0; $i < 100; $i++) { swoole_async_dns_lookup("www.baidu$i.com", function($host, $ip){ echo "{$host} reslove to {$ip}\n"; }); }