与Flask服务器同时运行while循环

Rya*_*uck 5 python celery flask

我正在使用python更新一些LED.我这样做是这样的:

from LEDs import *
myLEDs = LEDs()
done = False
while not done:
  myLEDs.iterate()
Run Code Online (Sandbox Code Playgroud)

我想使用Flask作为我可以在浏览器中运行的一些漂亮的ReactJS前端(用于更改当前模式等)和Python中的LED控制代码之间的桥梁.

我有Flask工作正常,可以处理HTTP请求等.我想知道如何设置myLEDs.iterate()连续运行(或快速运行)与我的烧瓶应用程序同时,同时仍然能够彼此通信,如此:

myLEDs = LEDs()

@app.route('/changePattern',methods=['POST'])
def changePattern():
  n = request.json['num']
  myLEDs.setPattern(n)
  return jsonify(**locals())

if __name__ == '__main__':
  app.debug = True
  myLEDs.setToFrequentlyIterateAndStillTalkToFlask()
  app.run()
Run Code Online (Sandbox Code Playgroud)

我遇到过celery,这似乎可以解决问题,但对于我的问题是多么简单似乎也有点过分.

使用Flask overkill只是想让UI管理我的python后端代码?是否有比Celery更简单的库用于在后台运行某些东西?

编辑

这是开发一个带有连接到Python后端的Node-Webkit前端的应用程序的大型项目的一部分.如果看起来不可行,我愿意改变我对这个应用程序的方法.

小智 9

使用multiprocess在Flask HTTP请求的不同进程中运行循环:

import time
from flask import Flask, jsonify
from multiprocessing import Process, Value


app = Flask(__name__)


tasks = [
   {
      'id': 1,
      'title': u'Buy groceries',
      'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 
      'done': False
   },
   {
      'id': 2,
      'title': u'Learn Python',
      'description': u'Need to find a good Python tutorial on the web', 
      'done': False
   }
]


@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
   return jsonify({'tasks': tasks})


def record_loop(loop_on):
   while True:
      if loop_on.value == True:
         print("loop running")
      time.sleep(1)


if __name__ == "__main__":
   recording_on = Value('b', True)
   p = Process(target=record_loop, args=(recording_on,))
   p.start()  
   app.run(debug=True, use_reloader=False)
   p.join()
Run Code Online (Sandbox Code Playgroud)

任务部分来自这里,来自我的多处理代码.
请注意"use_reloader = False"部分.这是避免两次运行循环所必需的.因为这里看到的原因

可以通过启动服务器来测试该功能

python <your_name_for_the example>.py
Run Code Online (Sandbox Code Playgroud)

并打电话

curl -i http://localhost:5000/todo/api/v1.0/tasks
Run Code Online (Sandbox Code Playgroud)