我使用请求在一个网页上发布一个get,在这个网页上,当现实世界中发生事件时,会添加新的数据。我想要继续得到这个数据,只要窗口是打开的,所以我设置stream = True,然后在数据流进来时逐行迭代。
page = requests.get(url, headers=headers, stream=True)
# Process the LiveLog data until stopped from exterior source
for html_line in page.iter_lines(chunk_size=1):
# Do other work here
这部分我没有问题,但是在退出这个循环时,我遇到了一个问题。通过查看其他StackOverflow线程,我知道我无法捕捉到任何信号,因为我的for循环被阻塞了。相反,我尝试使用下面的代码,这确实有效,但有一个大问题。
if QThread.currentThread().isInterruptionRequested():
break
这段代码将把我从循环中释放出来,但我发现for循环迭代的唯一时间是在get中引入新数据时,而在我的情况下,这不是连续的。我可以在几分钟或更长时间内不使用任何新数据,并且不希望在再次遍历循环检查是否请求中断之前必须等待新数据的到来。 如何在用户操作之后立即退出循环? 问题来源StackOverflow 地址:/questions/59379734/how-can-i-exit-a-python-requests-get-when-stream-true-but-data-is-not-always-f
您可以尝试使用aiohttp库https://github.com/aio.libs/aiohttp,特别是https://aiohttp.readthedocs.io/en/stable/streams.html#异步迭代支持。它应该是这样的:
import asyncio
import aiohttp
async def main():
url = 'https://httpbin.org/stream/20'
chunk_size = 1024
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
async for data in resp.content.iter_chunked(chunk_size):
print(data) # do work here
if __name__ == "__main__":
asyncio.run(main())
值得注意的是resp。内容是一个StreamReader,因此您可以使用其他可用的方法:https://aiohttp.readthedocs.io/en/stable/streams.html#aiohttp.StreamReader
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。