如何启动并忘记HTTP请求?

时间:2019-08-24 11:46:54

标签: python rest http

是否有可能触发请求而根本不等待响应?

对于python,大多数Internet搜索结果都在

  1. asynchronous-requests-with-python-requests
  2. grequests
  3. requests-futures

但是,以上所有解决方案都产生一个新线程,并等待每个相应线程的响应。是否有可能根本不在任何地方等待任何响应?

2 个答案:

答案 0 :(得分:1)

您可以将线程作为守护程序运行,请参见下面的代码;如果我注释掉该行(t.daemon = True),则代码将在退出之前等待线程完成。将守护程序设置为true时,它将简单地退出。您可以通过下面的示例进行尝试。

导入请求 导入线程 导入时间

def get_thread():
    g = requests.get("http://www.google.com")
    time.sleep(2)
    print(g.text[0:100])


if __name__ == '__main__':
    t = threading.Thread(target=get_thread)
    t.daemon = True  # Try commenting this out, running it, and see the difference
    t.start()
    print("Done")

答案 1 :(得分:0)

我真的不知道您只是通过发出http请求来达到什么目的。因此,我将列出一些我能想到的用例。

忽略结果

如果您唯一想要的是您的程序感觉像它一样永不停歇地发出请求。您可以使用aiohttp之类的库来制作concurrent request,而无需实际调用await进行响应。

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        session.get('http://python.org') 

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

但是如果您不检查任何内容,怎么知道请求已成功完成?

忽略身体

也许您想表现得很出色,并且担心失去阅读身体的时间。在这种情况下,您可以触发请求,检查状态码,然后关闭连接。

def make_request(url = "yahoo.com", timeout= 50):
    conn = http.client.HTTPConnection(url, timeout=timeout)
    conn.request("GET", "/")
    res = conn.getresponse()
    print(res.status)
    conn.close()

如果您像以前一样关闭连接,将无法reuse the connections

正确的方法

我建议使用aiohttp进行await异步调用,以便您可以添加必要的逻辑而不必阻塞。

但是,如果您要寻找性能,则需要使用http库的自定义解决方案。也许您还可以考虑在客户端和服务器中进行很小的请求/响应,小的超时和压缩。