fix: WithDefaultTimeout 不再套用到流式输出/双向流
流式输出(Invoke[chan T])返回的 channel 由调用方通过 range 自行决定 消费多久,典型场景是流式聊天回复,可能正常持续几十秒甚至更久。之前 WithDefaultTimeout 会不分场景地把这个全局默认超时套到整个调用生命周期 上(包括流还在正常输出的过程中),导致长时间运行的正常流式响应被腰斩。 改成流式输出/双向流完全不受 WithDefaultTimeout 影响,只认调用方显式传入 的 ctx deadline;需要超时保护的话必须自己 context.WithTimeout。普通调用 和流式输入不受影响,继续吃池子的默认超时。 新增 TestStreamOutIgnoresDefaultTimeout 验证;example/main.go 的 demoTimeout 补充示例4 演示这一行为;README 同步更新。
This commit is contained in:
@@ -323,6 +323,19 @@ func demoTimeout(script string) {
|
||||
if ctx3.Err() != nil {
|
||||
fmt.Println("channel 提前关闭,ctx.Err() =", ctx3.Err())
|
||||
}
|
||||
|
||||
// ── 示例4:WithDefaultTimeout 对流式输出完全不生效——即使不设 ctx deadline,
|
||||
// 池子的默认超时(这里是 500ms)也不会把一个耗时 900ms 的正常流式输出腰斩。
|
||||
// 想要超时保护,流式调用必须自己显式传 deadline(见示例3)。
|
||||
ch2, err := gobridge.Invoke[chan int](context.Background(), pool, "slow_range_gen", 1, 10, 100)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Print("slow_range_gen(1, 10, 100ms)(无 ctx deadline,池默认超时 500ms 但流式输出不受影响)=")
|
||||
for v := range ch2 {
|
||||
fmt.Print(" ", v)
|
||||
}
|
||||
fmt.Println() // 应该完整输出 1~9,不会被 500ms 默认超时打断
|
||||
}
|
||||
|
||||
func demoBlocking(script string) {
|
||||
|
||||
Reference in New Issue
Block a user