簡體   English   中英

殺死線程的正確方法

[英]Proper way to kill a thread

我正在嘗試做的是:

我正在嘗試從啟動的父進程中殺死具有無限循環的線程。 我希望在更改變量后立即終止子進程。

到目前為止,我所做的是:

我已經與兩個線程共享了一個變量,一旦循環獲得停止信號,它就會停止。

什么不起作用:

發送停止信號后,它並沒有殺死線程

這是一些示例代碼:

from flask import Flask, flash, redirect, render_template, request, session, abort
import light_control
import logging
import thread
app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
global stop 
stop = False

def loop_rainbow_cycle_successive(name):
    global stop
    while 1:
        if stop == True:
            break
        light_control.rainbow_cycle_successive()

def loop_rainbow_cycle(name):
    global stop
    while 1:
        if stop == True:
            break
        light_control.rainbow_cycle()

def loop_rainbow_colors(name):
    global stop
    while 1:
        if stop == True:
            break
        light_control.rainbow_colors()

RGB = ()
@app.route("/")
def index():
     return render_template(
        'index.html')
@app.route("/getColor/", methods=['POST'])
def getColor():
    RGB = (request.form['r'],request.form['g'],request.form['b'])
    light_control.setColor(RGB)
    return render_template('index.html')
@app.route("/useFunction/", methods=['POST'])
def useFunction():
    global stop
    stop = False
    func = request.form['function']
    if func == "rainbow_cycle_successive":
        thread.start_new_thread( loop_rainbow_cycle_successive, ("loop_rainbow_cycle_successive", ))
    elif func == "rainbow_cycle":
        thread.start_new_thread( loop_rainbow_cycle, ("loop_rainbow_cycle", ))
    elif func == "rainbow_colors":
        thread.start_new_thread( loop_rainbow_colors, ("loop_rainbow_cycle", ))
    elif func == "STOP":
        stop = True

    return render_template('index.html')
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

您可以使其成為一個進程並使用p.terminate()

碼:

from flask import Flask, flash, redirect, render_template, request, session, abort
import sys, os
sys.path.append(os.getcwd() + '/audio-reactive-led-strip/python/')#append entire directory
import logging
import multiprocessing
import light_control, visualization

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
global stop 
stop = False
p = multiprocessing.Process()

def terminate_process():
    global p
    if p.is_alive():
        p.terminate()
def loop_rainbow_cycle_successive(name):
    global stop
    while 1:
        if stop == True:
            break
        light_control.rainbow_cycle_successive()

def loop_rainbow_cycle(name):
    global stop
    while 1:
        if stop == True:
            break
        light_control.rainbow_cycle()

def loop_rainbow_colors(name):
    global stop
    while 1:
        if stop == True:
            break
        light_control.rainbow_colors()
def loop_visualization(name):
    # Initialize LEDs
    visualization.led.update()
    # Start listening to live audio stream
    visualization.microphone.start_stream(visualization.microphone_update)

RGB = ()
@app.route("/")
def index():
     return render_template(
        'index.html')
@app.route("/getColor/", methods=['POST'])
def getColor():
    terminate_process()
    RGB = (request.form['r'],request.form['g'],request.form['b'])
    light_control.setColor(RGB)
    return render_template('index.html')
@app.route("/useFunction/", methods=['POST'])
def useFunction():
    global stop
    global p
    stop = False
    func = request.form['function']
    if func == "rainbow_cycle_successive":
        terminate_process()
        p = multiprocessing.Process(target=loop_rainbow_cycle_successive, args=("loop_rainbow_cycle_successive", ))
        p.start()

    elif func == "rainbow_cycle":
        terminate_process()
        p = multiprocessing.Process(target=loop_rainbow_cycle, args=("loop_rainbow_cycle", ))
        p.start()

    elif func == "rainbow_colors":
        terminate_process()
        p = multiprocessing.Process(target=loop_rainbow_colors, args=("loop_rainbow_cycle", ))
        p.start()
    elif func == "visualization":
        terminate_process()
        p = multiprocessing.Process(target=loop_visualization, args=("loop_visualization", ))
        p.start()
    elif func == "STOP":
        stop = True
        terminate_process()

    return render_template('index.html')
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM