我试图在Flask应用程序中的Python中启动一个新线程.我正在做由请求触发的后台工作,但我不需要等待完成工作来响应请求.
是否可以在此次威胁中将烧瓶请求设置为进入的请求?原因是,我们对DB的查询(mongoDB前面的mongoengine)的ACL依赖于请求的用户(它从flask的请求对象中获取)以查看他们是否有权访问这些对象,并且因为请求是在子线程中不可用.
任何想法将不胜感激.
这是我现在如何处理它的伪代码,但它不起作用.
@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
#do tracking in sub-thread so we don't hold up the page
def handle_sub_view(req):
from flask import request
request = req
# Do Expensive work
thread.start_new_thread(handle_sub_view, (request))
return "Thanks"
Run Code Online (Sandbox Code Playgroud) 我有一个基于python/Flask构建的webapp,它有一个连续运行的相应后台作业,定期轮询每个注册用户的数据.
我希望这个后台作业在系统启动时启动并继续运行直到它关闭.我没有设置/etc/rc.d脚本,而是在应用程序启动时让烧瓶应用程序生成一个新进程(使用多处理模块).
因此,通过此设置,我只需要部署Flask应用程序,这也将使后台工作程序运行.
这有什么缺点?这是一个完整而彻底的黑客,在某种程度上是脆弱的,或者是一个很好的方式来设置一个具有相应后台任务的webapp?
我有这个装饰:
def timed_out(timeout):
def decorate(f):
if not hasattr(signal, "SIGALRM"):
return f
def handler(signum, frame):
raise TimedOutExc()
@functools.wraps(f)
def new_f(*args, **kwargs):
old = signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout)
try:
result = f(*args, **kwargs)
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
new_f.func_name = f.func_name
return new_f
return decorate
Run Code Online (Sandbox Code Playgroud)
但代码只能在linux上执行任何操作,因为在Windows上,没有SIGALRM.在Windows中使用此代码的最简单方法是什么?
大家好,工程师们正在努力改变世界!...以及任何愿意帮助的人:)
在python中添加Runloop代码后,uwsgi似乎需要更长的时间才能杀死
停止uwsgi过去非常快。最近,我集成了一个后台线程来定期检查数据库,并在需要时每60秒进行更改。
这似乎工作得很好,除了现在每次我尝试杀死uwsgi时,都需要很长时间。
################################
## deploy.ini module .py file ##
################################
from controllers import runloop
from flask import Flask
from flask import request, redirect,Response
app = Flask(__name__)
runloop.startrunloop()
if __name__ == '__main__':
app.run() #app.run(debug=True)
################################
## runloop.py ##
################################
### initialize run loop ###
## code ref: http://stackoverflow.com/a/22900255/2298002
# "Your additional threads must be initiated from the same app that is called by the WSGI server.
# 'The example below …Run Code Online (Sandbox Code Playgroud) 我有一个关于河内塔楼的简单游戏,该塔楼目前在航站楼上运行。它允许玩家输入自己的回合终端,并向终端输出可视化图像。
我的任务是制作一个flask应用程序,该应用程序将打开一个html页面,其中JS脚本将轮询服务器以获取有关游戏的信息,并将可视化效果从终端到网页加倍。
我的问题是游戏和烧瓶都有主循环,如果我随后运行它们,它们将无法并行运行。
因此,我需要游戏在终端中运行,而玩家需要在终端中轮流运行,但是我需要Web服务器来获取游戏状态并进行显示。
我的问题:我该怎么用?多处理线程?
说我有烧瓶的景色
from game import game
@app.route('/get_updates')
def get_updates():
return flask.jsonify(game.instance().board)
Run Code Online (Sandbox Code Playgroud)
如果flask和游戏在单独的线程中运行,它将如何工作?如何从另一个线程获取游戏对象?