Я попытался настроить приложение на python, которое запускает подписку или публикацию mqtt, и в то же время я запускаю сервер Socket.io. Моей первой попыткой было объединить эти две задачи - никаких проблем с функцией mqtt, но я не могу решить, как запустить сервер Socket.io в потоке. Вот мой код:
mqtt_sub.py
import paho.mqtt.client as mqtt
import test.constants as constants
MQTT_PATH = "sensor/water/level"
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
client.subscribe(MQTT_PATH)
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
def start_mqtt_subs():
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(constants.MQTT_SERVER, constants.MQTT_SERVER_PORT, constants.MQTT_SERVER_KEEPALIVE)
client.loop_forever()
socket.py
from aiohttp import web
import socketio
sio = socketio.AsyncServer(async_mode='aiohttp')
app = web.Application()
sio.attach(app)
async def index(request):
with open('index.html') as f:
return web.Response(text=f.read(), content_type='text/html')
@sio.on('test')
async def print_message(sid, message):
print("Socket ID: " , sid)
print(message)
app.router.add_get('/', index)
def start_socket_server():
web.run_app(app, host='0.0.0.0', port=1986)
main.py
from test.socket import start_socket_server
from test.mqtt_sub import start_mqtt_subs
import threading
def main():
t1 = threading.Thread(target=start_mqtt_subs)
t2 = threading.Thread(target=start_socket_server)
t1.start()
t2.start()
if __name__ == '__main__':
main()
Результатом этого является ошибка во время выполнения.
RuntimeError: There is no current event loop in thread 'Thread-2'.
Я попытался запустить socketio в обработчике, но ничего не произошло. Есть ли другое возможное решение моей проблемы. Заранее спасибо!