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

如何在两次httpie调用间用jq过滤JSON对象流并修复流中断问题

问题原因
  • 这是典型的标准IO缓冲导致的问题:类Unix系统中,程序的标准输出默认会根据输出目标的类型选择缓冲策略:
    • 输出到交互式终端时,使用行缓冲,每生成一行内容就立即输出
    • 输出到管道、文件等非交互式目标时,使用全缓冲,只有缓冲区内的数据攒到固定大小(通常是4KB~8KB)后才会批量输出
  • 你单独执行http ... | jq ...时,最终输出到终端,jq自动使用行缓冲所以能看到实时输出;当后面接while循环管道时,jq的输出目标变成管道,自动切换为全缓冲,就会出现长时间没有输出的现象,你添加的--compact-output、--monochrome-output都不影响缓冲策略,所以无法解决问题。
修复方案

给jq命令添加--unbuffered参数,强制jq关闭缓冲、实时输出每一行处理结果,修改后代码如下:

http --stream get \
    "https://api.twitter.com/2/tweets/search/stream" \
    "Authorization: Bearer $BEARER_TOKEN" |
    jq --unbuffered --compact-output --monochrome-output '. | {id: .data.id, rules: .matching_rules}' |
    while read -r line; do
        echo "$line" | http post localhost:8888/posts
    done

如果你的系统里的旧版本jq不支持该参数,也可以用stdbuf工具强制jq使用行缓冲:

http --stream get \
    "https://api.twitter.com/2/tweets/search/stream" \
    "Authorization: Bearer $BEARER_TOKEN" |
    stdbuf -oL jq --compact-output --monochrome-output '. | {id: .data.id, rules: .matching_rules}' |
    while read -r line; do
        echo "$line" | http post localhost:8888/posts
    done
其他过滤Twitter流的方案
  • 用Python写极简流式处理脚本:直接用请求库拉取流,用内置json模块处理后请求FastAPI接口,避免多管道缓冲问题,逻辑更可控
  • 用awk做简单的JSON字段提取:如果处理逻辑不复杂,awk默认使用行缓冲,不会出现类似的缓冲问题
  • 直接在FastAPI侧做字段过滤:接收完整的Twitter流数据后,在服务端做字段裁剪,省去Shell管道处理环节,性能和稳定性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:15:03