Функция испускания колбы в потоке OSCserver
Я создаю приложение Flask-socketio, в котором я хочу отправлять сокет при получении сообщения OSC, чтобы получить его в веб-приложении благодаря socketio.js.
from flask import Flask, render_template, copy_current_request_context, current_app
from flask_socketio import SocketIO, emit, send
from OSC import OSCClient, OSCMessage, OSCServer
import time, threading
app = Flask(__name__)
socketio = SocketIO(app)
client = OSCClient()
client.connect( ("localhost", 62345))
receive_address = ('localhost', 62346)
server = OSCServer(receive_address)
# simple callback functions
def answer_handler(addr, tags, stuff, source):
with app.app_context():
socketio.emit('tempo', 1)
# adding callback functions to listener
server.addMsgHandler("/puredata", answer_handler)
if __name__ == '__main__':
#Start OSCServer in extra thread
st = threading.Thread( target = server.serve_forever )
st.daemon = True
st.start()
print('OSC server is started')
socketio.run(app, host='0.0.0.0')
Даже если я не получаю сообщение об ошибке, сокет не получен со стороны javascript, потому что функция emit вызывается в другом потоке, и возникают конфликты с контекстом запроса.
Я пробовал несколько вещей в соответствии с некоторыми другими билетами stackru:
socketio = SocketIO(app, async_mode='threading')
Добавление этой строки перед функцией обработчика
@copy_current_request_context
Или воссоздайте экземпляр socketio в обратный вызов
def answer_handler(addr, tags, stuff, source):
socketio_connection = SocketIO(app)
with app.app_context():
socketio_connection.emit('tempo', 1)
Но ни одно из этих решений не работает, и мне нужно интегрировать решение этой проблемы "контекста" в мой поток. Обратите внимание, что:
socketio.emit('tempo', 1)
отлично работает из этой темы, и получил в части JavaScript