flask -socketio на uWSGI - PullRequest
       114

flask -socketio на uWSGI

0 голосов
/ 29 мая 2020

У меня есть flask -socketio app

(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 l oop [адрес: 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 ()

Я симпатичный сильно застрял, ищу предложения.

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

Не работал с gevent 20.5.2, который я установил с помощью 'pip install gevent'. Изменился на gevent==1.4.0, и теперь uWSGI запускается как положено.

0 голосов
/ 31 мая 2020

Простой ответ на ваш вопрос - изменить это:

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 или удалите, чтобы он автоматически устанавливался во время выполнения для вас.

Команда для запуска приложения Flask -SocketIO с uWSGI показана в документации:

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

Также необходимо установить gevent.

...