开发者社区> 问答> 正文

当stream = True但数据并不总是流入时,我如何退出Python请求get

我使用请求在一个网页上发布一个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

展开
收起
kun坤 2019-12-29 21:50:56 755 0
1 条回答
写回答
取消 提交回答
  • 您可以尝试使用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

    2019-12-29 21:51:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载