如何启动并忘记HTTP请求?

2024-04-26 18:59:46 发布

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


Tags: python
2条回答

我真的不知道你仅仅通过启动一个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库的自定义解决方案。也许您还可以考虑在您的客户机和服务器中使用非常小的请求/响应、小的超时和压缩。你知道吗

您可以将线程作为守护进程运行,请参阅下面的代码;如果我注释掉该行(t.daemon=True),代码将等待线程完成后退出。当daemon设置为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")

相关问题 更多 >