【发布时间】:2020-06-10 14:24:44
【问题描述】:
我正在调试一个 Python 烧瓶应用程序。该应用程序在配置有 6 个线程和 1 个进程的 uWSGI 上运行。我正在使用Flask-Executor 卸载一些较慢的任务。这些任务创建与 Flask 应用程序的连接,即同一个进程,并执行一些 HTTP GET 请求。执行程序配置为最多使用 2 个线程。此应用程序在 Ubuntu 16.04.3 LTS 上运行。
执行器中的线程每隔一段时间就会完全停止工作。该代码使用 Python requests 库来执行请求。潜在的错误消息是:
Action failed. HTTPSConnectionPool(host='somehost.com', port=443): Max retries exceeded with url: /api/get/value (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f8d75bb5860>: Failed to establish a new connection: [Errno 11] Resource temporarily unavailable',))
在执行器中运行的代码如下所示:
adapter = requests.adapters.HTTPAdapter(max_retries=3)
session = requests.Session()
session.mount('http://somehost.com:80', adapter)
session.headers.update({'Content-Type': 'application/json'})
...
session.get(uri, params=params, headers=headers, timeout=3)
我花了很多时间试图将 Python 请求堆栈剥离到它使用的 C 套接字。我还尝试使用小型 C 和 Python 程序重现此错误。起初我认为可能是套接字没有关闭,因此我们用完了作为资源的允许套接字,但这给了我更多类似于“打开的文件太多”的消息。
抛开 Python 堆栈,什么会导致套接字 connect() 命令上出现[Errno 11] Resource temporarily unavailable?另外,如果您在使用请求时遇到了这种情况,是否有我可以传递的参数来防止这种情况发生?
我看过What can cause a “Resource temporarily unavailable” on sock send() command StackOverflow 帖子,但我是在 send() 命令上,而不是在初始 connect() 上,我怀疑这是代码挂起的地方。
【问题讨论】:
标签: python c sockets unix linux-kernel