使用场景:

在很多具有随机启动性模块或任务的项目中,因为启动模块或任务的时间不确定,停止的时间也不确定,这样的场景下,就可以使用本方案。例如,我们通过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)