我有一个烧瓶应用程序正在运行一些计算,并且从Jupyter笔记本发出请求。客户端代码遵循基本格式:
outputs = []
for batch in request_batches:
response = requests.post(flask_address, json=json.dumps(batch), timeout=3600)
outputs.append(response)
这个想法是遍历一系列请求批次(对于应用程序而言分批处理很有意义)并收集响应。
通常情况下,对于每个批次,我会在Flask应用程序端看到请求记录,并在计算完成后确认“发布”。
00.000.000.000 - - [29/Apr/2020 02:21:46] "POST //docking HTTP/1.1" 200 -
一批完成后,循环继续并发送下一个请求。
我遇到的问题是,有时Flask大小的计算需要比正常时间更长的时间,这会导致笔记本中的请求循环挂起(请注意,比正常时间长几分钟,在设置超时时间)。在Flask大小上,计算成功完成,并且有一个Post确认。
在笔记本大小上,循环挂起,并且没有其他请求。这不是超时问题-没有超时错误。笔记本单元一直挂着,直到我手动中断它为止。
当我中断时,我看到以下堆栈跟踪:
~/opt/anaconda3/envs/env/lib/python3.7/socket.py in readinto(self, b)
587 while True:
588 try:
--> 589 return self._sock.recv_into(b)
590 except timeout:
591 self._timeout_occurred = True
在我中断之后,我可以确认导致循环挂起的响应没有添加到输出中。因此,Flask应用程序以某种方式正在发布响应,但客户端笔记本未收到响应。再次有95%的时间运行正常,但是5%的请求处理时间较长会导致请求循环冻结。
有人知道如何调试吗?