如何不阻止与python请求建立初始连接?
我有一个服务器,它使用请求向另一个可能正在运行或可能没有运行的服务器进行查询。如果服务器没有运行,我不想长时间阻塞;我可以马上处理这个错误。但是,timeout参数似乎不适用于建立初始连接的过程 从终端,我运行:如何不阻止与python请求建立初始连接?,python,python-2.7,python-requests,windows-subsystem-for-linux,Python,Python 2.7,Python Requests,Windows Subsystem For Linux,我有一个服务器,它使用请求向另一个可能正在运行或可能没有运行的服务器进行查询。如果服务器没有运行,我不想长时间阻塞;我可以马上处理这个错误。但是,timeout参数似乎不适用于建立初始连接的过程 从终端,我运行: >>> import time >>> import requests >>> t1 = time.time() ; exec("try: requests.get('http://192.168.99.100/', timeout
>>> import time
>>> import requests
>>> t1 = time.time() ; exec("try: requests.get('http://192.168.99.100/', timeout=1.0)\nexcept: pass") ; t2 = time.time() ; t2 - t1
21.00611114501953
这大约需要21秒,与我给出的超时无关。我还尝试使用eventlet's timeout,但结果相同:
>>> import time
>>> import eventlet
>>> requests = eventlet.import_patched('requests')
>>> t1 = time.time() ; exec("try: \n with eventlet.Timeout(1): requests.get('http://192.168.99.100/')\nexcept: pass") ; t2 = time.time() ; t2 - t1
21.00276017189026
我得到的连接错误是:
ConnectionError: ('Connection aborted.', error(11, 'Resource temporarily unavailable'))
最后,我在Windows Linux子系统下运行python,这可能与套接字的工作方式不同。来自文档:
超时不是整个响应下载的时间限制;相当地
如果服务器尚未对发出响应,则会引发异常
超时秒数(更准确地说,如果服务器上未接收到字节
基础套接字超时(秒)
也就是说,这是一个类似投票的例子
import gevent, time
import requests
from gevent import monkey, spawn, sleep
monkey.patch_all() # for working with requests/sockets
do_not_wait = []
print(time.time())
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0))
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0))
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0))
[x.start() for x in do_not_wait]
print(time.time())
while True:
sleep(1)
print([x.ready() for x in do_not_wait])
从文档中:
超时不是整个响应下载的时间限制;相当地
如果服务器尚未对发出响应,则会引发异常
超时秒数(更准确地说,如果服务器上未接收到字节
基础套接字超时(秒)
也就是说,这是一个类似投票的例子
import gevent, time
import requests
from gevent import monkey, spawn, sleep
monkey.patch_all() # for working with requests/sockets
do_not_wait = []
print(time.time())
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0))
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0))
do_not_wait.append(gevent.spawn(requests.get, 'http://192.168.99.100/', timeout=1.0))
[x.start() for x in do_not_wait]
print(time.time())
while True:
sleep(1)
print([x.ready() for x in do_not_wait])
您可以使用任务管理器(如
芹菜),然后在工作线程上设置超时。我认为requests
支持gevent
而不是eventlet
,这可能就是为什么使用eventlet
会出现同样的问题。您可以使用任务管理器(如芹菜
),然后设置工作线程的超时。我认为requests
支持gevent
而不是eventlet
,所以这可能就是为什么您在使用eventlet
时会看到同样的问题。它在OS X上对我有效。可能是与Windows相关的问题。作为一种解决方法,您可以使用线程-因此,如果线程中的请求调用在超时时间内没有响应,只需在主线程上继续。@J.P.Petersen我认为这可能是当前的问题,因为WSL仍在工作中。它在OS X上对我有效。可能是与Windows相关的问题。作为一种解决方法,您可以使用线程-因此,如果线程中的请求调用在超时时间内没有响应,只需在主线程上继续。@J.P.Petersen我认为这可能是当前的问题,因为WSL仍在工作中。