使用场景:
在很多具有随机启动性模块或任务的项目中,因为启动模块或任务的时间不确定,停止的时间也不确定,这样的场景下,就可以使用本方案。例如,我们通过web页面的按钮来启动一个爬虫,通过停止按钮来终止这个爬虫。
原理:
首先初始化一个环境变量来存储这个要启动的模块的状态,0为未启动,1为已启动,当点击启动这个模块的按钮时,程序开始判断这个环境变量的状态,如果,这个环境变量值为0时,则先标记这个环境变量的值为1,然后开启新线程来启动任务,在任务运行的循环过程中,每次循环时判断这个环境变量的值,如果为0,则终止,如果为1则继续运行,一直到所有任务运行完毕,结束线程,并将环境变量的值重新赋值为0,而终止按钮则只需要赋值这个环境变量的值为0。
文件代码
主程序入口main.py:
import os
from flask import Flask, render_template, session, request, redirect, url_for, jsonify
app = Flask(__name__, template_folder='www/templates', static_folder='www/static')
app.secret_key = 'sdfasdf'
os.environ['MODEL_BAIJIAXING_STATUS'] = "0" # 百家姓数据生成状态
##################################
# 百家姓模块
###################################
@app.route("/model_baijiaxing_run",methods=["GET"])
def model_baijiaxing_run():
"""
姓氏来源内容采集模块
:return:
"""
if os.environ.get('MODEL_BAIJIAXING_STATUS') == "0":
os.environ["MODEL_BAIJIAXING_STATUS"] = "1"
start_task_thread()
return jsonify({"message": "姓氏来源生成模块开始运行."}), 202
else:
return jsonify({"message": "姓氏来源生成模块已经在运行."}), 202
@app.route("/model_baijiaxing_stop",methods=["GET"])
def model_baijiaxing_stop():
os.environ["MODEL_BAIJIAXING_STATUS"] = "0"
return redirect(url_for('status'))
def start_task():
"""
生成数据
:return:
"""
i = 1
while True:
if os.environ.get('MODEL_BAIJIAXING_STATUS') == "0":
print("开始暂停线程。")
break
j[i]=time.time()
make_file_content(j)
os.environ['MODEL_BAIJIAXING_STATUS'] = "0"
# 点击启动按钮时,执行这个函数,来开启新线程来启动模块start_task。
def start_task_thread():
"""
开启单线程来生成数据
:return:
"""
thread = threading.Thread(target=start_task)
thread.start()
print("开启了新线程!")
app.run(host="0.0.0.0", port=5000, debug=True)