【问题标题】:Merging Python Threads with Flask将 Python 线程与 Flask 合并
【发布时间】:2018-07-17 18:37:19
【问题描述】:

我正在开发一个 Flask 应用程序,该应用程序会在 Nvidia Jestson 启动后立即启动。有2个线程: 1.串口读取不断从uart获取值并更新网页

  1. backgroundthread 根据从 html 表单获得的值进行一些计算。

我的代码是这样的:

thread1 = Thread()
thread2 = Thread()
thread1_stop_event = Event()

class serial_read_Thread(Thread):

    def __init__(self):
        self.delay = 0.1
        self.port = serial.Serial ( port='/dev/ttyTHS2', baudrate=115200, 
                                   parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE,
                                   bytesize=serial.EIGHTBITS, timeout=1)

        super(serial_read_Thread, self).__init__()

    def serial_read (self):
        try:
            x = self.port.read().decode()
            recvd_string += x
            #receive the list as string and convert it to list
            for val in range(1, len(recvd_string)):
                if (val % 2 != 0):
                    index = int(float(recvd_string[val]))
                else:
                    received_signal_values[index] = recvd_string[val]

            number1 = received_signal_values[0]
            number2 = received_signal_values[1]
            socketio.emit('newnumber', {'number1':number1, 'number2':number2}, namespace='/test')
            time.sleep(self.delay)
        except UnicodeDecodeError:
            print("UnicodeDecodeError \n")
            pass

    def run(self):
        self.serial_read()


class Backgroundthread(Thread):

    def __init__(self):
        super(Backgroundthread, self).__init__()

    def process_data(self):
        do_calculation()

    def run(self):
        self.process_data()


@app.route("/", methods=['GET', 'POST'])
def hello():
    form = TestForm()
    global thread2

    if request.method == 'POST':
        Get the values from the html form 

        if not thread2.isAlive():
           thread2 = Backgroundthread()
           thread2.start()

    return render_template('hello.html', form=form)


@socketio.on('connect', namespace='/test')
def test_connect():
    # need visibility of the global thread object
    global thread1
    print('Client connected')

    #Start the serial read thread 
    print("Starting Serial Read Thread")
    thread1 = serial_read_Thread()
    thread1.daemon = True
    thread1.start()

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')

if __name__== "__main__":
  socketio.run(app)

当我手动运行代码时,我看到加载了我的页面的 Web 浏览器,值正在从串行线程更新。此外,当我通过网页输入值时,我看到正在处理后台线程。 但是当我从 Jetson 上的启动脚本运行代码时,同样的方法不起作用。我看到网页的值正在更新,但是当我从 html 表单输入值时,我没有看到正在处理的后台线程。另外我想知道这是否是将线程与烧瓶应用程序合并的正确方法。 对不起,很长的帖子。 提前致谢

【问题讨论】:

    标签: python-3.x multithreading flask


    【解决方案1】:

    Flask 只是处理请求的框架。虽然它有一个内置的 webserver fpr 调试,但它本质上不是一个 webserver。在我的生产烧瓶应用程序中,我通常使用 gevent 作为我的烧瓶应用程序的网络服务器。 因此,根据网络服务器,将使用不同的策略来处理请求。每个请求使用一个线程,重用之前分配的线程,每个请求一个进程或其他任何东西......这就是为什么我建议不要在烧瓶应用程序中使用线程。

    所以我建议您尝试找到一种方法来保持端点无状态并且根本不使用线程。

    如果你真的需要或想要并行处理某些东西,我有一个解决你的问题的方法,你可以从你的端点启动一个 python 子进程。无论网络服务器策略如何,它都会并行运行。我在我的数据库到数据库导入 api 上使用了这个策略。端点验证有效负载并启动将解决问题的子进程。然后端点返回一个键来跟踪整个数据库的过程。

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多