如何在Python执行期间将变量传递给线程?

时间:2016-07-08 17:20:11

标签: python multithreading flask

我创建了一个控制LED照明的应用程序。我想支持换色模式。为了使程序的其他部分工作,这部分代码正在一个单独的线程中执行。不幸的是,一旦线程启动,我无法通过基于Web的界面(烧瓶)更改颜色循环模式。有没有办法让我将可变数据传递给线程(color1,color2和speed)?此外,线程的构造方式使其从父类继承stop方法。

app.py

from flask import Flask, render_template, request, jsonify
...
cycleToggle = "on"

@app.route("_/start")
def _start():
    global cycleToggle
    global thread
    if cycleToggle=="on":
        thread = Pins.cyclecolors()
        thread.start()
        cycleToggle = "off"
    return render_template("cyclecolors.html") #flask

@app.route("/_stop")
def _stop():
    global cycleToggle
    cycleToggle = "on"
    thread.stopit()
    return render_template("cyclecolors.html")

@app.route("/_updateCycle")
def _updateCycle():
    color1 = request.args.get('color1')
    color2 = request.args.get('color2')
    speed = request.args.get('speed')
    Pins.updateCycle(color1,color2,speed)

Pins.py

import threading
...
class StoppableThread(threading.Thread):

    def __init__(self):
        super(StoppableThread, self).__init__()
        self._stopper = threading.Event()

    def stopit(self):
        self._stopper.set()

    def stopped(self):
        return self._stopper.is_set()

class cyclecolors(StoppableThread):

    def __init__(self):
        StoppableThread.__init__(self)

    def run(self):
        while not self.stopped():
            ## THIS IS WHERE THE COLOR CYCLING CODE WOULD GO THAT UTILIZES
            ## THE color1, color2, AND speed VARIABLES.

def updateCycle(color_1, color_2, speed_a)
    global color1
    global color2
    global speed
    color1 = color_1
    color2 = color_2
    speed = speed_a
    return

我明白使用带线程的全局变量是不受欢迎的;但是,线程没有改变变量。它只需要阅读它们。

1 个答案:

答案 0 :(得分:0)

  

我有办法将变量数据传递给线程吗?   (color1,color2和speed)?

当然,请查看Queues

你需要做的是让生产者在队列中推送颜色,速度等数据,让你的消费者(线程)拉出这些变量并对它们进行处理。