You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash中带&的curl POST请求等待位置及并行执行原理疑问

关于curl并行请求Spring REST API的行为疑问

场景复现

我向Spring REST API端点发送多组curl POST请求:

  1. 串行执行命令:
for i in $(seq 1 10); do curl -v -F file=@Input.java localhost:8080/translator/java; done
  1. 并行执行命令(curl后添加&):
for i in $(seq 1 10); do curl -v -F file=@Input.java localhost:8080/translator/java &; done

Spring服务端核心逻辑:接收MultipartFile后,先等待5秒再将文件写入本地。

  • 串行执行时,生成的*_Input.java文件创建时间间隔约5秒,符合预期;
  • 并行执行时,所有文件的创建时间完全一致。

疑问解答

1. 并行执行时文件创建时间一致的原因

Spring后端(默认使用Tomcat作为Servlet容器)会维护一个请求处理线程池。当10个curl请求几乎同时到达时,线程池会为每个请求分配独立的工作线程。每个线程都会执行“等待5秒→写入文件”的逻辑,由于这些线程几乎是同时启动等待的,5秒后会几乎同时完成文件写入操作,因此所有文件的创建时间看起来完全一致。

2. curl请求在哪里等待?

并行执行时,每个curl命令被放到客户端本地操作系统的后台进程中运行。这些curl进程会在客户端等待服务端的响应,而不是在服务端的请求队列中排队。父shell不会等待单个curl完成,而是直接启动下一个请求,所以所有curl几乎同时发起并等待服务端处理。

3. 如何实现“同时”执行?

在shell命令末尾添加&的作用是让当前命令在后台子进程中执行,父shell无需等待该命令执行结束,就能立即继续循环的下一次迭代。这样整个循环会在极短时间内启动10个独立的curl进程,这些进程几乎同时与服务端建立TCP连接、发送POST请求。服务端线程池同时处理这些请求,最终实现了请求的“同时”执行与结果的同步生成。

对比串行执行的逻辑:串行时shell必须等待前一个curl请求完全处理完毕(服务端完成整个流程并返回响应),才会启动下一个curl,因此每个请求的处理间隔约5秒,文件创建时间也呈现间隔特征。

内容的提问来源于stack exchange,提问作者OrenIshShalom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:16:14