在Python中的两个线程之间交换数据

时间:2016-07-13 10:12:57

标签: python multithreading flask

我正在尝试在两个独立模块中的两个线程之间交换简单数据,我找不到更好的方法来正确地执行它

这是我的架构: 我有一个主脚本启动我的两个线程:

from threading import Thread,RLock
from flask import Flask, render_template, request, url_for, redirect
GUI = Flask(__name__)

class ThreadGui(Thread):

    def __init__(self):
        Thread.__init__(self)

    def run(self):
            GUI.run()



wsgi_app = GUI.wsgi_app


@GUI.route('/')
def index():
    print"INDEX"
    return render_template("index.html")


@GUI.route('/prod')
def prod():
    return render_template("prod.html")


@GUI.route('/maintenance')
def maintenance():
    return render_template("maintenance.html")


@GUI.route('/button', methods = ['GET','POST'])
def button():
    buttonState = True
    print"le bouton est TRUE"
    return redirect(url_for('prod'))

我的第一个帖子是一个带有FLASK应用程序的GUI。在这个GUI中,我按下HTML页面中的一个按钮,然后在按钮功能

中将buttonState切换为True
from threading import Thread,RLock
from globals import buttonState
import time


verrou = RLock()
class Sequencer(Thread):

    def __init__(self):
        Thread.__init__(self)

    def run(self):
        with verrou:
            while 1:
                if buttonState:
                    print"le bouton est true, redirection de l'ordre"
                else:
                    time.sleep(2)
                    print"rien ne se passe"

在我的第二个帖子中,我需要收到有关更改的通知

form.setAttribute('id', "form");

我不知道让这两个线程讨论的方法。

1 个答案:

答案 0 :(得分:2)

从您的描述中Event object看起来是最合理的解决方案:

class Sequencer(Thread):

    def __init__(self, button_pressed_event):
        Thread.__init__(self)
        self._event = button_pressed_event

    def run(self):
        while not self._event.is_set():
            time.sleep(2)
            print ('Sleeping...')
        print('Button was pressed!')

在您的GUI线程中,您只需在按下按钮后设置事件(event.set())。

如果您不关心调试,也可以简化run方法:

def run(self):
    self._event.wait()
    print('Button was pressed!')