gpt4 book ai didi

带有请求管道的 Python HTTP 客户端

转载 作者:IT老高 更新时间:2023-10-28 21:05:19 28 4
gpt4 key购买 nike

问题:我需要向服务器发送许多 HTTP 请求。我只能使用一个连接(不可协商的服务器限制)。服务器的响应时间加上网络延迟太高——我落后了。

请求通常不会更改服务器状态,也不依赖于先前请求的响应。所以我的想法是简单地将它们相互叠加发送,将响应对象排入队列,并依赖于传入响应的 Content-Length: 来将传入响应提供给下一个等待的响应对象。换句话说:将请求传送到服务器。

这当然不是完全安全的(任何没有 Content-Length: 的回复都意味着麻烦),但我不在乎——在这种情况下,我总是可以重试任何排队的请求。 (安全的方法是在发送下一个位之前等待 header 。这可能对我有足够的帮助。没有办法事先测试。)

因此,理想情况下,我希望以下客户端代码(使用客户端延迟来模拟网络延迟)在三秒内运行。

现在是 64000 美元的问题:是否有 Python 库已经做到了这一点,还是我需要自己开发?我的代码使用 gevent;如有必要,我可以使用 Twisted,但 Twisted 的标准连接池不支持流水线请求。如有必要,我也可以为某些 C 库编写一个包装器,但我更喜欢 native 代码。

#!/usr/bin/python

import gevent.pool
from gevent import sleep
from time import time

from geventhttpclient import HTTPClient

url = 'http://local_server/100k_of_lorem_ipsum.txt'
http = HTTPClient.from_url(url, concurrency=1)

def get_it(http):
print time(),"Queueing request"
response = http.get(url)
print time(),"Expect header data"
# Do something with the header, just to make sure that it has arrived
# (the greenlet should block until then)
assert response.status_code == 200
assert response["content-length"] > 0
for h in response.items():
pass

print time(),"Wait before reading body data"
# Now I can read the body. The library should send at
# least one new HTTP request during this time.
sleep(2)
print time(),"Reading body data"
while response.read(10000):
pass
print time(),"Processing my response"
# The next request should definitely be transmitted NOW.
sleep(1)
print time(),"Done"

# Run parallel requests
pool = gevent.pool.Pool(3)
for i in range(3):
pool.spawn(get_it, http)

pool.join()
http.close()

最佳答案

Dugong是一个仅支持 HTTP/1.1 的客户端,声称支持真正的 HTTP/1.1 流水线。 The tutorial包括几个关于如何使用它的例子,包括一个 using threads和另一个 using asyncio .

请务必确认您正在与之通信的服务器确实支持 HTTP/1.1 流水线 - 一些服务器声称支持 HTTP/1.1 但并未实现流水线。

关于带有请求管道的 Python HTTP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19312545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com