相关疑难解决方法(0)

在启动子线程时,Flask抛出'在请求上下文之外工作'

我试图在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 mongoengine flask

52
推荐指数
4
解决办法
6万
查看次数

有烧瓶的背景工作者

我有一个基于python/Flask构建的webapp,它有一个连续运行的相应后台作业,定期轮询每个注册用户的数据.

我希望这个后台作业在系统启动时启动并继续运行直到它关闭.我没有设置/etc/rc.d脚本,而是在应用程序启动时让烧瓶应用程序生成一个新进程(使用多处理模块).

因此,通过此设置,我只需要部署Flask应用程序,这也将使后台工作程序运行.

这有什么缺点?这是一个完整而彻底的黑客,在某种程度上是脆弱的,或者是一个很好的方式来设置一个具有相应后台任务的webapp?

python flask

39
推荐指数
1
解决办法
3万
查看次数

python:相当于SIGALRM的windows

我有这个装饰:

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 windows signals signal-handling alarm

12
推荐指数
1
解决办法
2万
查看次数

NGINX-Python-UWSGI杀死问题

大家好,工程师们正在努力改变世界!...以及任何愿意帮助的人:)

在python中添加Runloop代码后,uwsgi似乎需要更长的时间才能杀死


设定

  • 蟒蛇烧瓶
  • 使用uwsgi在nginx上运行
  • 使用psql数据库

问题

停止uwsgi过去非常快。最近,我集成了一个后台线程来定期检查数据库,并在需要时每60秒进行更改。

这似乎工作得很好,除了现在每次我尝试杀死uwsgi时,都需要很长时间。

  • “好像”就像我让服务器运行的时间越长,导致死亡的时间就越长,
  • 还是在当前的60秒循环结束后总是被杀死?(我不确定我的视觉检查是否支持这一点)
  • 听起来像泄漏?

这是我最近添加的代码

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

python multithreading nginx flask uwsgi

3
推荐指数
1
解决办法
2055
查看次数

与主应用程序并行运行Flask服务器

我有一个关于河内塔楼的简单游戏,该塔楼目前在航站楼上运行。它允许玩家输入自己的回合终端,并向终端输出可视化图像。

我的任务是制作一个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和游戏在单独的线程中运行,它将如何工作?如何从另一个线程获取游戏对象?

python flask

1
推荐指数
1
解决办法
2956
查看次数