包装一个循环以使用HTTP管道

2024-09-28 01:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它每Y分钟向同一个服务器重复发出X个请求,并且当前没有使用任何管道/HTTP保持活动,部分原因是每个请求的前面都必须有一个头。在

#!/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打印,因此流水线将变得复杂。

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

理想情况下,我正在寻找一个sh的解决方案,但是如果不会花费太长时间的话,perl和{}也有。(以及curl和{},以及OpenBSD所拥有的所有其他功能。)


Tags: echo服务器脚本httpforbin管道example
1条回答
网友
1楼 · 发布于 2024-09-28 01:29:58

纯粹基于shell的解决方案可能行不通,因为在执行keep-alive/pipeline时必须重用相同的TCP连接。但是,您当前的解决方案也不是完全基于shell的,因为它总是调用curl和fgrep,如果这是您对shell解决方案的理解,那么shell也可以调用Perl和Python。在

我建议只使用LWP(Perl)或requests(Python)库,它们都使用httpkeep-alive。关于如何使用这些库,已经有足够多的例子了,所以没有必要在这里重复。除此之外,版本之间的行为可能会有所不同(比如HTTP keep alive在默认情况下是否打开,未知的OpenBSD版本上安装了哪些版本)。在大多数情况下,HTTP管道技术比保持活动状态(可能是针对非常小的请求)更难,但不会加快速度。还要注意keep alive并不能神奇地加速所有事情,因为服务器端也必须支持它。虽然大多数服务器实现了它,但有时会关闭它以使用更少的资源。在

相关问题 更多 >

    热门问题