在python中使用请求时,Socket.getaddrinfo被卡住,无限期地阻塞进程
下面是我的项目的简单演示:在python中使用请求时,Socket.getaddrinfo被卡住,无限期地阻塞进程,python,python-requests,blocking,Python,Python Requests,Blocking,下面是我的项目的简单演示: import requests import json, time import socket socket.setdefaulttimeout(2) def request(url, msg=None, timeout=2, method="get"): flag, resp = False, None try: if method == "get": resp = requests.get(url, para
import requests
import json, time
import socket
socket.setdefaulttimeout(2)
def request(url, msg=None, timeout=2, method="get"):
flag, resp = False, None
try:
if method == "get":
resp = requests.get(url, params=msg, timeout=timeout, verify=False)
elif method == "post":
resp = requests.post(url, data=msg, timeout=timeout, verify=False)
elif method == "delete":
s=requests.Session()
resp = s.delete(url, data=msg, timeout=timeout, verify=False)
flag = True
except requests.exceptions.Timeout:
resp = "time_out"
except requests.exceptions.TooManyRedirects:
resp = "too_many_redirect"
except requests.ConnectionError as err:
resp = "connection_error"
except requests.exceptions.RequestException as err:
resp = str(err.__class__.__name__)
return flag, resp
if __name__ == '__main__':
while True:
print request("https://www.google.com", timeout=1)
time.sleep(1)
运行一段时间后,进程将阻塞,当我返回pstack时,我始终看到以下情况:
Thread 3 (Thread 0x7f465f310700 (LWP 22537)):
#0 0x00000030dd0e993d in recvmsg () from /lib64/libc.so.6
#1 0x00000030dd10f8d5 in make_request () from /lib64/libc.so.6
#2 0x00000030dd10fd0a in __check_pf () from /lib64/libc.so.6
#3 0x00000030dd0d2ec7 in getaddrinfo () from /lib64/libc.so.6
#4 0x00007f46647e07bf in socket_getaddrinfo () from ...
我发现了一条消息,并且知道它在查询DNS时被阻塞,我已经为请求设置了超时,但是它没有用!有人遇到过这个问题吗?谢谢你的帮助。在用谷歌搜索了很长时间后,我找到了这篇文章,错误被修复了。但是在我的机器上更新glibc是不可能的 我曾经编写过一个python程序,它也使用请求模块,它没有这个问题,所以我仔细比较了这两个模块,发现最大的区别是使用http请求的线程数。第一个只有一个使用请求的线程,但最后一个有两个,因此我将程序重构为单线程程序进行测试。这个问题再也没有发生过 他们说请求是线程安全的,我还没有找到这个错误的确切原因,所以我只是使用了单线程方法来避免这个问题 如果有人知道任何建议,我们将不胜感激