Flask uWSGI上的烧瓶插座

Flask uWSGI上的烧瓶插座,flask,uwsgi,flask-socketio,Flask,Uwsgi,Flask Socketio,我有这个烧瓶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,

我有这个烧瓶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上运行此功能的最佳实践是什么? 我一直试图这样做,但没有成功,不断地出错

错误: *正在运行gevent循环引擎[addr:0x5561d3f745a0]* 该死工人1(pid:13772)死亡:(试图重生。。。 工人重生太快了!!!我不得不睡一会儿(2秒)。。。 新生的uWSGI工人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()


我被卡住了,正在寻找一些建议。

你的问题的简单答案是改变这个:

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
第一个函数()
startBackgroundTask()
应用程序运行(主机=0.0.0.0',端口=5000)
为此:

firstFunction()
startBackgroundTask()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
应用程序运行(主机=0.0.0.0',端口=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

您的问题的简单答案是更改此选项:

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
第一个函数()
startBackgroundTask()
应用程序运行(主机=0.0.0.0',端口=5000)
为此:

firstFunction()
startBackgroundTask()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
应用程序运行(主机=0.0.0.0',端口=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

没有使用我用'pip install gevent'安装的gevent 20.5.2。更改为
gevent==1.4.0
,现在它按预期启动。

没有使用我用'pip install gevent'安装的gevent 20.5.2。更改为
gevent==1.4.0
,nuWSGI如何按预期启动。

您是否考虑过使用
APScheduler
模块?尝试了APScheduler,但SocketIO-emit消息延迟了约25秒。“SocketIO.emit”命令现在位于backgroundTask()中,计划每1秒使用“sched.add”作业运行一次(背景任务,“间隔”,秒=1)'您能在OP中更新相同的代码吗?您读过关于在uWSGI上运行Flask SocketIO的文档吗?您的uWSGI start命令完全错误,而且您正在强制执行
async\u mode='gevent'
,这将不适用于uWSGI。您考虑过使用
APScheduler
模块吗?尝试过APScheduler,并且能够做出一些改进ng工作,但SocketIO emit消息延迟约25秒。“SocketIO.emit”命令现在位于backgroundTask()中,计划每1秒使用“sched.add_作业”(backgroundTask,'interval',seconds=1)运行一次'你能在OP中更新相同的代码吗?你读过关于在uWSGI上运行Flask SocketIO的文档吗?你的uWSGI start命令完全错误,而且你正在强制执行
async\u mode='gevent'
,这不适用于uWSGI。我做了更改,并且得到了该死的worker 1错误。gevent已安装:gevent==20.5.2 gevent websocket==0.10.1 python socketio==4.6.0 uwsgi版本是2.0.18,在Ubuntu 18.0.4上。我还删除了firstFunction()和startBackgroundTask()所以这只是flask SocketIO我选择设置新的EC2 t2.micro Ubuntu 18.04实例以重新开始。我正在执行flask SocketIO的步骤1-3,然后执行uWSGI,如图所示。我马上得到
该死的!工人1(pid:30699)死了:(尝试重生…工人重生太快了!!!我必须睡一会儿(2秒)…
错误。在EC2 t2.micro实例上执行此操作是否有问题?感谢您的建议。您是否修复了
异步模式
参数?是的,我从flask导入flask,从flask中呈现了模板\u socketio导入socketio app=flask(名称)app.config['SECRET\u KEY']=“SECRET!”socketio=socketio(app)如果name='main':app.run(主机='0.0.0',端口=5000)然后在日志中寻找其他线索,不确定还有什么建议。如果你在问题中添加完整的日志,我很乐意看一看。我做了更改,得到了该死的worker 1错误。Gevent已安装:Gevent==20.5.2 Gevent websocket==0.10.1 python socketio==4.6.0 uwsgi版本是2.0.18,在Ubuntu 18.0.4上。我也先删除了它函数()和startBackgroundTask(),所以这只是flask socketioI选择设置新的EC2 t2.micro Ubuntu 18.04实例以重新开始。我遵循flask SocketIO的步骤1-3,然后执行uWSGI,如图所示。我立即得到
该死的!worker 1(pid:30699)死亡:(正在尝试重新启动…工人重新启动太快!!!我必须睡一会儿(2秒).
错误。在EC2 t2.micro实例上执行此操作是否有问题?感谢您的建议。您是否修复了
异步\u模式
参数?是的,我从flask导入flask,从flask\u socketio导入socketio app=flask渲染了模板(name)app.config['SECRET\u KEY']='SECRET!'socketio=socketio(app)如果name='main':app.run(host='0.0.0',port=5000),那么在日志中查找其他线索,不确定还有什么建议。如果您在问题中添加了完整的日志,我们很乐意看一看。