背景
并发执行工作流时,代码节点报错:
Code execution service is unavailable
。
问题原因
代码节点运行在沙盒(sandbox)服务中,而 sandbox 服务默认配置有可能是空的,或者是如下这种:
max_workers: 4 max_requests: 50 |
但不管是怎样的,当你在代码节点报:
Code execution service is unavailable
。时,你可以进入api或任意容器执行:
curl -X POST http://sandbox:8194/v1/sandbox/run \ -H "Content-Type: application/json" \ -H "X-API-Key: dify-sandbox" \ -d '{"language":"python3","code":"print(1+1)"}' |
当出现:
{"code":-503,"message":"Too many requests","data":null} |
时,基本就可确定是配置max_workers的原因了,如下:

参数含义
-
max_workers:控制“同时真正开始执行 run 逻辑的并发上限”。实现为一个带容量的信号量 channel。当并发超过max_workers时,请求不会立刻失败,而是在sem <- struct{}{}处阻塞排队,等有空位再继续。 -
max_requests:控制“同时在处理链路中的请求总数上限”(更准确说:in-flight 数量)。实现为一个current计数器。当current >= max_requests时,直接返回503+"Too many requests"。
相关代码片段:
m.lock.RLock() if m.current >= max { m.lock.RUnlock() c.JSON(http.StatusServiceUnavailable, types.ErrorResponse(-503, "Too many requests")) c.Abort() return } |
解决办法
在 Dify 的
docker-compose.yaml
中对 sandbox 部分配置进行修改,新增
MAX_WORKERS
和
MAX_REQUESTS
的环境变量。
示例:
MAX_WORKERS: ${SANDBOX_MAX_WORKERS:-400} MAX_REQUESTS: ${SANDBOX_MAX_REQUESTS:-5000} |

然后,停止主窗口,并重新部署后就会是:
root@36436831ac9c:/# curl -X POST http://sandbox:8194/v1/sandbox/run \ -H "Content-Type: application/json" \ -H "X-API-Key: dify-sandbox" \ -d '{"language":"python3","code":"print(1+1)"}' {"code":0,"message":"success","data":{"error":"","stdout":"2\n"}} |
问题解决。
其它参考,对我来说没用,但你们可参考: