[英]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.