代码之家  ›  专栏  ›  技术社区  ›  AndrewWhalan

在烧瓶中穿线不与UWSGI一起工作,而是在命令行上工作

  •  2
  • AndrewWhalan  · 技术社区  · 7 年前

    我有一个flask应用程序,在命令行上运行时可以正常工作,但是当它通过uwsgi运行时,它不能正确响应请求,或者工作线程不能正常工作。我重写了一个简单的概念证明/失败程序,它演示了以下问题:

    from datetime import datetime
    from threading import Event, Thread
    
    from flask import Flask
    
    
    class JobManager:
        def __init__(self):
            self.running = False
            self.event = Event()
    
        def start(self):
            self.running = True
            while self.running:
                print("Processing Job at", datetime.now().strftime('%c'))
                self.event.clear()
                self.event.wait(5)
                if self.event.is_set():
                    print("Interrupted by request!")
    
        def stop(self):
            self.running = False
            self.event.set()
    
    
    app = Flask(__name__)
    jobs = JobManager()
    
    t = Thread(target=jobs.start)
    t.start()
    
    @app.route('/')
    def hello_world():
        global jobs
        jobs.event.set()
    
        return "I'm alive at " + datetime.now().strftime('%c')
    
    
    if __name__ == '__main__':
        app.run()
    

    我希望呼叫/路由将打印“被请求中断!”在控制台上,但它只是挂起,即使作业应该在单独的线程中运行。

    我的uwsgi配置是:

    [uwsgi]
    module = app:app
    
    master = true
    processes = 5
    threads = 2
    
    socket = 0.0.0.0:5000
    protocol = http
    
    reload-mercy = 5
    worker-reload-mercy = 5
    
    die-on-term = true
    enable-threads = true
    thunder-lock = true
    
    logto = /home/user/dev/flask-thread/uwsgi_log.log
    logto2 = /home/user/dev/flask-thread/uwsgi2_log.log
    
    env = PATH=/home/user/dev/flask-thread/env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    

    然后我在Venv中运行uwsgi: uwsgi --ini uwsgi-test.ini

    如果我用的话就行了 python app.py 并使用内置的flask开发服务器。

    我唯一的猜测是,这与吉尔与UWSGI的互动有关,但这是一个疯狂的猜测,我不知道如何阻止。

    1 回复  |  直到 7 年前
        1
  •  4
  •   SACHIN CHAVAN    7 年前

    为我使用UWSGI标志 --lazy 工作。

    uwsgi foo.ini --socket=0.0.0.0:5000 --protocol=http --lazy -w wsgi
    

    说明:

    引用 http://lists.unbit.it/pipermail/uwsgi/2011-June/002307.html :

    单进程(无主进程):

    这个过程创建了一个线程,在该线程中,wsgi可调用文件将数据放入其中。

    这没问题

    使用主进程:

    主机加载应用程序并生成线程。然后它分叉一个或 更多的工人。这些工人是新流程,与 线程在主服务器中生成。所以你的数据将一去不返(只有 master可以访问初始线程)。

    您有两种方法可以遵循:

    1)添加——懒惰地进入命令行,这样你的应用程序就会被加载。 在主人的叉子之后,每个工人都会得到它的线。

    2)重写应用程序以使用uwsgi.post_fork_hook功能。