【发布时间】:2016-05-13 00:39:22
【问题描述】:
我正在使用带有请求的 python 2。这个问题更多的是对我如何提高这种性能的好奇。
现在的问题是我必须将请求标头中的加密签名发送到 HTTPS 服务器。这个签名包括一个“nonce”,它必须是一个时间戳,并且总是必须增加(在服务器端)。
显然,这会对在多个线程上运行多个 HTTP 会话造成严重破坏。请求最终没有按顺序发送,因为它们在生成标头和发送 HTTPS POST 请求之间被中断。
解决方案是在创建签名之前锁定线程,直到接收 HTTPS 数据结束。理想情况下,我想在发送 HTTP 请求后释放 LOCK,而不必等待接收数据。在发送 HTTP 标头之后,有什么方法可以使用请求释放锁?见代码示例:
self.lock 是一个 Threading.Lock。这个类(self)的这个实例在多个线程之间共享。
def get_nonce(self):
return int(1000*time.time())
def do_post_request(self, endpoint, parameters):
with self.lock:
url = self.base + endpoint
urlpath = endpoint
parameters['nonce'] = self.get_nonce()
postdata = urllib.urlencode(parameters)
message = urlpath + hashlib.sha256(str(parameters['nonce']) + postdata).digest()
signature = hmac.new(base64.b64decode(self.secret_key), message, hashlib.sha512)
headers = {
'API-Key': self.api_key,
'API-Sign': base64.b64encode(signature.digest())
}
data = urllib.urlencode(parameters)
response = requests.post(url, data=data, headers=headers, verify=True).json()
return response
【问题讨论】:
-
是的,futures 看起来最有前途,因为它看起来很轻,并且示例有 2 个代码点(开始请求和完成请求)。除非必须,否则我不想向项目添加更多依赖项。也希望未来将与 python 2.7 反向移植一起使用。
-
意识到这些并不能解决问题。我必须确保在释放锁之前已经发送了标头...到目前为止,为了破解它,我已经人为延迟了 500 毫秒。
-
:-(。唯一想到的其他建议:使用请求来准备请求数据,但使用普通套接字来实际发送数据/接收响应。我 认为 i> 你也可以使用请求来解析响应,但是,你会丢失看起来会话和重定向被自动处理的东西。你可以在服务器端进行设计更改吗?
-
不需要会话或重定向,所以我可能会深入研究请求对象,看看是否能找到有用的东西。猴子补丁插座什么的。
标签: python multithreading python-2.7 python-requests