如何不阻止与python请求建立初始连接?

2024-06-17 08:11:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个服务器,它使用请求对另一个可能正在运行或不在运行的服务器进行查询。如果服务器没有运行,我不想阻塞很长时间;我可以马上处理错误。但是,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,这可能与套接字的工作方式不同。你知道吗


Tags: import服务器httpgettimetimeoutpassrequests
2条回答

从文档中:

timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds).

这是一个使用投票的例子。你知道吗

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])

您可以使用任务管理器(如celery),然后在工作线程上设置超时。我认为requests支持gevent而不是eventlet,这可能就是为什么使用eventlet会出现同样的问题。你知道吗

相关问题 更多 >