Функция испускания колбы в потоке 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

0 ответов

Другие вопросы по тегам