Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用请求时,Socket.getaddrinfo被卡住,无限期地阻塞进程_Python_Python Requests_Blocking - Fatal编程技术网

在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请求的线程数。第一个只有一个使用请求的线程,但最后一个有两个,因此我将程序重构为单线程程序进行测试。这个问题再也没有发生过

他们说请求是线程安全的,我还没有找到这个错误的确切原因,所以我只是使用了单线程方法来避免这个问题

如果有人知道任何建议,我们将不胜感激