【问题标题】:Wrap a loop to use HTTP pipelining包装一个循环以使用 HTTP 流水线
【发布时间】:2015-12-09 08:05:24
【问题描述】:

我有一个脚本,它每 Y 分钟重复向同一台服务器发出 X 次请求,并且目前不使用任何流水线/HTTP Keep-Alive,部分原因是每个请求之前必须在输出中添加一个标头。

#!/bin/sh -x
for k in $(jot 6)
  do
    while read i
      do
        echo -n $i
        curl -s "http://example.org/?param=$i" | fgrep result
    done <<EOF
some
uri
data
here
EOF
    sleep 600
done

我想要将其转换为对每个批次使用到 example.com 的单个连接,而不是为每个请求建立一个新连接。

请注意,流水线会因为必须打印标头而变得复杂,例如echo -n $i

约束:每个请求中可能有 0 行或 1 行与我们尝试的字符串匹配 fgrep(因此,当前脚本也部分损坏,因为它不会如果有 0 行,则打印 \n)。

理想情况下,我正在寻找sh 解决方案,但我也有perlpython2.7 可用,如果这不会花费太长时间的话。 (还有 curlwget,以及 OpenBSD 拥有的所有其他东西。)

【问题讨论】:

    标签: python perl curl sh keep-alive


    【解决方案1】:

    纯粹基于 shell 的解决方案可能无法正常工作,因为在进行保持活动/流水线操作时必须重用相同的 TCP 连接。但是,您当前的解决方案也不是完全基于 shell,因为它一直调用 curl 和 fgrep,如果这是您对 shell 解决方案的理解,那么您的 shell 也可以调用 Perl 和 Python。

    我建议只使用 LWP (Perl) 或 requests (Python) 库,它们都使用 HTTP keep-alive。关于如何使用这些库的例子已经够多了,这里就不再赘述了。除此之外,版本之间的行为可能会有所不同(例如 HTTP keep-alive 是否默认启用,并且未知 OpenBSD 版本上安装了哪些版本)。 HTTP 流水线更难,但在大多数情况下(可能适用于非常小的请求)并没有比保持活动更能加快速度。另请注意,keep-alive 不会神奇地加速一切,因为它也必须在服务器端得到支持。虽然大多数服务器都实现了它,但有时会关闭它以使用更少的资源。

    【讨论】:

    • 嗯,我想我的意思是定期保持活动,而不是真正的流水线。
    猜你喜欢
    • 2018-03-12
    • 2011-03-18
    • 2012-07-31
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2013-01-26
    • 2012-01-08
    相关资源
    最近更新 更多