python - 为什么 python 请求没有终止,为什么打印这些单独的日志?
问题描述
我正在运行一项作业,该作业发出许多请求以从 API 检索数据。为了发出请求,我使用了 requests 模块并对此代码进行了迭代:
logger.debug("Some log message")
response = requests.get(
url=self._url,
headers=self.headers,
auth=self.auth,
)
logger.debug("Some other log message")
这通常会产生以下日志:
[...] Some log message
[2019-08-27 03:00:57,201 - DEBUG - connectionpool.py:393] https://my.url.com:port "GET /some/important/endpoint?$skiptoken='12345' HTTP/1.1" 401 0
[2019-08-27 03:00:57,601 - DEBUG - connectionpool.py:393] https://my.url.com:port "GET /some/important/endpoint?$skiptoken='12345' HTTP/1.1" 200 951999
[...] Some other log message
然而,在极少数情况下,作业永远不会终止,并且在日志中它说:
[...] Some log message
[2019-08-27 03:00:57,201 - DEBUG - connectionpool.py:393] https://my.url.com:port "GET /some/important/endpoint?$skiptoken='12345' HTTP/1.1" 401 0
它永远不会打印剩余的日志消息,也永远不会返回。我无法重现该问题。我提出了从未手动返回的请求,但它给了我想要的响应。
问题:
为什么
urllib3
总是在打印状态码为 200 的日志之前打印状态码为 401 的日志?这种情况总是如此,还是由身份验证或 API 服务器的问题引起的?在第二个日志被剪断的罕见情况下,我的假设是否正确,即应用程序卡在发出永远不会返回的请求?或者:
a)是否会
requests.get
引发异常,导致其他日志语句永远不会被打印,然后“神奇地”在我的代码中的某个地方被捕获?b) 有没有我没有意识到的其他可能性?
附加信息:
Python 2.7.13 (我们已经在升级到 Python3,但是这需要在升级完成之前解决)
请求 2.21.0
urllib3 1.24.3
auth 通过了
requests.auth.HTTPDigestAuth(username, password)
我的代码没有 try/except 块,这就是我在问题 2.a 中“神奇地”写的原因。这是因为我们更希望这项工作“大声”失败。
我正在迭代生成 url 的生成器以发出多个请求
该作业由 Jenkins 2.95 按计划运行
当一切顺利运行时,它会在大约 5 分钟内发出大约 300 个请求
我正在运行两个 python 脚本,它们都运行相同的代码,但在一项作业中针对不同的端点但并行运行
更新
回答Q1:
解决方案
要回答您的问题, 1. 似乎是您的 API 的问题。确保您可以运行 curl 命令并查看?
curl -i https://my.url.com:port/some/important/endpoint?$skiptoken='12345'
它永远不会终止,可能是因为 API 没有响应。添加超时以避免这种阻塞。
response = requests.get(url=self._url, headers=self.headers, auth=self.auth, timeout=60)
希望这对您的问题有所帮助。
推荐阅读
- python - 如何在共享值的同时同时运行两个线程?
- amazon-web-services - 在 Terraform 中定义模块依赖关系
- angular - 数组绑定到剑道网格 Angular 2
- java - 无法在 org.apache.ignite:ignite-hibernate_5.1:jar 收集依赖项
- cakephp - 如何在 CakePHP 3 中取消设置视图变量
- python-2.7 - “未找到 ID”的错误
- html - CSS & SASS 导航问题
- google-cloud-platform - 您可以使用 Cloud Dataflow 检测对象/文件名吗
- prometheus - 大型 WAL 文件
- javascript - javascript代码从执行中跳过了一些行