Dart中Future.wait支持的任务列表最大长度限制是多少
问题解答
Future.wait本身不存在固定的传入任务列表最大长度限制,你遇到的报错和Future.wait的列表容量无关,是操作系统层面的资源限制导致的。
报错根因
- 你当前的代码写法中,
_list.map((e) => e.requestInterface())执行时会立刻触发所有遍历到的请求逻辑,所有网络请求会在短时间内全部并发启动,不会按顺序排队执行。 - 每个网络请求底层都会创建系统套接字(Socket),套接字和本地打开的文件一样,会占用进程的文件描述符配额。操作系统对单进程可持有的文件描述符数量有默认上限,移动端系统默认阈值通常在1024左右,部分定制系统可能更低。
- 当一次性发起的并发请求数量超过当前进程的文件描述符上限时,新的套接字无法创建,就会抛出
SocketException: Connection Failed (OS Error: Too many open files, errno = 24)错误。
你限制并发请求数量后,同一时间占用的文件描述符始终低于系统阈值,请求可以分批正常执行,程序自然恢复正常。
可参考的并发控制实现
你可以通过分片批量执行的方式控制最大并发数,避免一次性打满系统资源,示例代码如下:
resultList = []; // 可根据实际场景调整最大并发数,客户端场景建议设置在5~15区间 const int maxConcurrentCount = 10; for (var i = 0; i < _list.length; i += maxConcurrentCount) { final batchEnd = (i + maxConcurrentCount > _list.length) ? _list.length : i + maxConcurrentCount; final batchTask = _list.sublist(i, batchEnd); final batchResult = await Future.wait( batchTask.map((e) => e.requestInterface()) ); resultList.addAll(batchResult); }
注意:过高的并发数除了触发系统文件描述符限制,还可能占满设备带宽、触发服务端接口限流,不建议无限制提升并发数。
内容的提问来源于stack exchange,提问作者lynn
相关产品推荐
相关产品推荐

