Streamlit使用GoogleNews模块时如何等待前序操作完成再执行后续代码
解决方案
出现该问题的核心原因是GoogleNews库的搜索、拉取新闻操作为异步执行,不会阻塞后续代码运行,同时也可能存在Streamlit脚本重运行机制导致的执行流程混乱问题,可通过以下方案解决:
方案1:轮询检测加载状态(最通用)
不使用固定时长的time.sleep(),改为循环检测结果是否返回,同时设置最大超时时间避免无限等待:
import time import streamlit as st # 执行搜索、拉取新闻操作 googlenews.search(inputt.iloc[0,0]) googlenews.get_news(inputt.iloc[0,0]) # 轮询获取结果,最大等待30秒 max_wait_seconds = 30 start_time = time.time() result_0 = [] while len(result_0) == 0 and (time.time() - start_time) < max_wait_seconds: result_0 = googlenews.page_at(1) time.sleep(0.5) # 每次查询间隔0.5秒,避免请求频率过高触发反爬 # 后续判断逻辑 if len(result_0) == 0: st.error("请求超时或未搜索到相关新闻,请重试")
方案2:适配异步调用逻辑
如果你使用的是异步版本的GoogleNews依赖库,可通过async/await确保操作完成后再返回结果,Streamlit原生支持异步函数执行:
import asyncio import streamlit as st async def get_news_data(keyword): await googlenews.search(keyword) await googlenews.get_news(keyword) return await googlenews.page_at(1) result_0 = asyncio.run(get_news_data(inputt.iloc[0,0])) if len(result_0) == 0: st.error("未搜索到相关新闻")
方案3:适配Streamlit重运行机制
Streamlit每次用户交互都会重跑全量脚本,可通过st.session_state缓存执行状态与结果,避免重复执行或逻辑跳转:
import time import streamlit as st # 初始化状态标记 if "news_load_done" not in st.session_state: googlenews.search(inputt.iloc[0,0]) googlenews.get_news(inputt.iloc[0,0]) max_wait_seconds = 30 start_time = time.time() st.session_state.result_0 = [] while len(st.session_state.result_0) == 0 and (time.time() - start_time) < max_wait_seconds: st.session_state.result_0 = googlenews.page_at(1) time.sleep(0.5) st.session_state.news_load_done = True # 直接使用缓存的结果执行判断 if len(st.session_state.result_0) == 0: st.error("未获取到有效新闻数据")
注意事项
- 可根据实际业务需求调整最大等待时长,避免用户等待过久
- 轮询间隔不建议低于0.3秒,防止请求频率过高触发Google的反爬限制
- 若超时概率较高,可增加最多3次的重试逻辑,失败后重新发起搜索请求
内容的提问来源于stack exchange,提问作者reem alfouzan
相关产品推荐
相关产品推荐

