『玩转Streamlit』--集成定时任务

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

学习了Streamlit了之后,可以实验给自己的下令行小工具加一个简单的界面。
本篇总结了我改造自己的数据采集的工具时的一些经验。
1. 概要

与常规的程序相比,数据采集任务的特点很明显,比如它一般都是I/O密集型程序,涉及大量网络请求或文件读写,耗费的时间比力长;而且每每是按照一定的时间间隔周期性地执行。
这样的程序对交互性要求不高,以是我之前都是用下令行的方式来实现的。
下令行固然完成采集的任务没有问题,但是采集程序多了之后,管理起来不太方便,
比如,必要查察某个采集程序的配置,或是查察采集程序的状态时,必要登录服务器的下令行页面去查察。
于是,自然就想到使用Streamlit来构造一个简单的界面,本来采集程序也是用Python编写的,
与Streamlit集成非常方便。
下面重要使用Streamlit完成以下功能:

  • 启动定时任务
  • 停止定时任务
  • 查察任务状态
2. 实现示例

数据集采集任务都是耗时比力长的,在下令行中无所谓,把定时任务放在一个无限循环中,
不停的去执行就行了。停止采集只要中断下令行(比如Ctrl+C)就行。
但是,在Streamlit中,不能被采集任务壅闭住页面,以是要用多线程或多进程的方式来启动。
由于差异的采集程序是独立的,以是下面的示例采用多进程的方式。
同时,通过Streamlit的session_state来存储采集程序的状态,从而实现控制采集程序启停的功能。
大致的结构如下:

具体代码如下,其中的采集程序是模拟的,重要是为了展示怎样通过Streamlit App来控制其他任务的执行。
  1. import streamlit as st
  2. import pandas as pd
  3. import multiprocessing
  4. import time
  5. if "status01" not in st.session_state:
  6.     st.session_state.status01 = False
  7. if "status02" not in st.session_state:
  8.     st.session_state.status02 = False
  9. def spider01():
  10.     """模拟数据采集01"""
  11.     while True:
  12.         print("数据采集01...")
  13.         time.sleep(3)
  14. def spider02():
  15.     """模拟数据采集02"""
  16.     while True:
  17.         print("数据采集02...")
  18.         time.sleep(3)
  19. st.title("采集管理")
  20. spider_data = pd.DataFrame(
  21.     {
  22.         "ID": [1, 2],
  23.         "名称": ["采集01", "采集02"],
  24.         "状态": [False, False],
  25.     }
  26. )
  27. spiders = st.data_editor(
  28.     spider_data,
  29.     width=500,
  30.     num_rows="dynamic",
  31.     disabled=["ID", "名称"],
  32. )
  33. status01 = spiders.iloc[0, 2]
  34. status02 = spiders.iloc[1, 2]
  35. if status01 != st.session_state.status01:
  36.     if status01:  # 启动
  37.         print("启动采集01")
  38.         spider01_proc = multiprocessing.Process(target=spider01)
  39.         spider01_proc.daemon = True
  40.         spider01_proc.start()
  41.         st.session_state.proc01 = spider01_proc
  42.     else:
  43.         print("停止采集01")
  44.         st.session_state.proc01.terminate()
  45.         st.session_state.proc01.join()
  46.     st.session_state.status01 = status01
  47. if status02 != st.session_state.status02:
  48.     if status02:  # 启动
  49.         print("启动采集02")
  50.         spider02_proc = multiprocessing.Process(target=spider02)
  51.         spider02_proc.daemon = True
  52.         spider02_proc.start()
  53.         st.session_state.proc02 = spider02_proc
  54.     else:
  55.         print("停止采集02")
  56.         st.session_state.proc02.terminate()
  57.         st.session_state.proc02.join()
  58.     st.session_state.status02 = status02
复制代码

通过勾选状态列的Checkbox来控制采集程序的启停,运行的日记如下:
  1. $  streamlit run .\app.py
  2.   You can now view your Streamlit app in your browser.
  3.   Local URL: http://localhost:8501
  4.   Network URL: http://192.168.0.6:8501
  5. 启动采集01
  6. 数据采集01...
  7. 数据采集01...
  8. 启动采集02
  9. 数据采集01...
  10. 数据采集02...
  11. 数据采集01...
  12. 数据采集02...
  13. 数据采集01...
  14. 数据采集02...
  15. 停止采集02
  16. 数据采集01...
  17. 停止采集01
复制代码
3. 总结

通过Streamlit,可以快速的提供一个简单易用的数据采集控制界面。
上面使用sesstion来管理状态其实不太合理(重新打开欣赏器session会丢失),使用sqlite之类的持久存储来保存更好。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表