uWSGI上的flask-socketio

时间:2020-05-29 03:46:55

标签: flask uwsgi flask-socketio

我有这个flask-socketio应用

(venv) ubuntu@ip-172-31-18-21:~/code$ more app.py
from flask_socketio import SocketIO, send, emit
from flask import Flask, render_template, url_for, copy_current_request_context
from time import sleep
from threading import Thread, Event

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'

socketio = SocketIO(app, async_mode='gevent')

thread = Thread()
thread_stop_event = Event()

def firstFunction():
    print("*** First function")

def backgroundTask():
    while not thread_stop_event.isSet():
        socketio.emit('bg-socketio', {'data':'background-data'}, namespace='/', broadcast=True)
        socketio.sleep(2)

def startBackgroundTask():
    global thread

    if not thread.is_alive():
        thread = socketio.start_background_task(backgroundTask)

@app.route('/')
def main():
    return render_template('index.html', title='SocketIO')  

@socketio.on('connect_event', namespace='/')
def handle_message_client_connected(message):
    print("*** Client connected")
    emit('c-socketio', {'data':' you connected!'}, namespace='/') 

if __name__ == '__main__':
    firstFunction()
    startBackgroundTask()
    socketio.run(app, host='0.0.0.0', port=5000) 

我希望firstFunction()和startBackgroundTask()能够在应用启动时运行。

在uWSGI上运行它的最佳实践是什么? 我一直试图做到这一点,但没有成功,不断出错 https://flask-socketio.readthedocs.io/en/latest/#uwsgi-web-server

错误: *正在运行的gevent循环引擎[addr:0x5561d3f745a0] * 该死的 !工人1(pid:13772)死亡:(正在尝试重生... 工人重生太快!!!我必须睡一会儿(2秒)... 重新生成的uWSGI worker 1(新PID:13773)

也尝试过

uwsgi --socket 0.0.0.0:5000 --protocol=http --enable-threads -w wsgi:app

(venv) ubuntu@ip-172-31-18-21:~/code$ more wsgi.py
from uapp import app

if __name__ == "__main__":
    app.run()

将uapp.py更改为

if __name__ == '__main__':
    firstFunction()
    startBackgroundTask()
    app.run(host='0.0.0.0', port=5000)

但这不会运行firstFunction()或startBackgroundTask()

我非常困惑,正在寻找一些建议。

2 个答案:

答案 0 :(得分:0)

您问题的简单答案是更改此内容

if __name__ == '__main__':
    firstFunction()
    startBackgroundTask()
    app.run(host='0.0.0.0', port=5000)

对此:

firstFunction()
startBackgroundTask()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

不过,您还有其他一些问题需要解决。

async_mode变量设置为gevent,但是您将uWSGI用作服务器。将其更改为gevent_uwsgi或将其删除,以便在运行时为您自动设置。

文档中显示了使用uWSGI启动Flask-SocketIO应用程序的命令:

uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app

您还需要安装gevent

答案 1 :(得分:0)

无法与我通过“ pip install gevent”安装的gevent 20.5.2一起使用。更改为gevent==1.4.0,现在它uWSGI可以按预期启动。