与Flask服务器同时运行while循环 [英] Run while loop concurrently with Flask server

查看:617
本文介绍了与Flask服务器同时运行while循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用python更新一些LED。我已经这样做了:

  from LEDs import * 
myLEDs = LEDs()
done = False
未完成:
myLEDs.iterate()

想用Flask作为一个好看的ReactJS前端之间的桥梁,我可以在我的浏览器中运行(改变当前的模式等)和Python中的LED控制代码。

我有Flask工作正常,可以处理HTTP请求,等我想知道如何设置 myLEDs.iterate()





$ b $

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

if __name__ =='__main__':
app.debug = True
myLEDs.setToFrequentlyIterateAndStillTalkToFlask()
app.run()

我遇到了 celery ,这看起来好像是可以做的,但看起来像我的问题是多么简单的矫枉过正。

使用Flask矫枉过正只需要一个UI来管理我的python后端代码?有一个比芹菜更简单的库用于在后台运行的东西?

编辑
$ b 这是大型项目的一部分,一个连接到Python后端的Node-Webkit前端。如果看起来不可行,我愿意改变我的方法来使用这个应用程序。

解决方案

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

$ pre $ 进口时间
从瓶子进口Flask,jsonify
从多进程进口进程,价值


应用程序= 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在网上找到一个好的Python教程',
'done':False
}


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


def record_loop(loop_on):
而真:
如果loop_on.value == True:
print(l oop 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

任务部分来自这里是,来自我的多处理代码

注意use_reloader = False部分。这是避免运行循环两次所必需的。由于这个原因请参阅这里


$ b

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

pre $ $ c $>
$ b

并调用
$ py $&$ $ $

  curl -i http:// localhost:5000 / todo / api / v1.0 / tasks 


I'm updating some LEDs using python. I've been doing this like so:

from LEDs import *
myLEDs = LEDs()
done = False
while not done:
  myLEDs.iterate()

I wanted to use Flask to act as a bridge between some nice-looking ReactJS front-end I can run in my browser (to change the current pattern, etc) and the LED-controlling code in Python.

I have Flask working fine, can handle HTTP requests, etc. I'm wondering how I can set myLEDs.iterate() to continuously run (or run on a rapid schedule) concurrently with my flask app, while still being able to communicate with one another, like so:

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()

I came across celery, which seems like it would do the trick, but also seems like overkill for how simple my problem is.

Is using Flask overkill for simply wanting a UI to manage my python back-end code? Is there a simpler library than Celery to use for running something in the background?

Edit

This is part of a larger project to develop an app with a Node-Webkit front-end attached to a Python backend. I'm open to changing my approach to this app if it doesn't seem feasible.

解决方案

Use multiprocess to run the loop in a different process as the Flask HTTP requests:

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()

The tasks part is from here, multiprocessing code from me.
Note the "use_reloader=False" part. This is necessary to avoid running the loop twice. For the reason see here

The functionality can be tested by starting up the server with

python <your_name_for_the example>.py

and calling

curl -i http://localhost:5000/todo/api/v1.0/tasks

这篇关于与Flask服务器同时运行while循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆