История изменений
Исправление KivApple, (текущая версия) :
Вот я сейчас как раз попытался вызвать call_soon_threadsafe:
from datetime import timedelta
import eventlet
import eventlet.wsgi
import socketio
import asyncio
from threading import Thread
from flask import Flask, render_template
sio = socketio.Server()
app = Flask(__name__)
loop = asyncio.new_event_loop()
@app.route('/')
def main():
return render_template('main.html')
@sio.on('my-msg')
def handle_my_msg(sid, data):
loop.call_soon_threadsafe(handle_my_msg_async, (data,))
@asyncio.coroutine
def handle_my_msg_async(data):
print(str(data))
def run_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
if __name__ == '__main__':
loop_thread = Thread(target=run_loop, args=(loop,))
loop_thread.start()
app = socketio.Middleware(sio, app)
eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
В результате получаю ошибку:
TypeError: coroutines cannot be used with call_soon()
ЧЯДНТ?
За идею с очередью спасибо. Думаю, её стоит использовать для передачи данных обратно. В смысле, что мне нужно как-то вызвать sio.emit, чтобы отдать ответ клиенту и скорее всего это можно сделать только из цикла eventlet.
Исходная версия KivApple, :
Вот я сейчас как раз попытался вызвать call_soon_threadsafe:
from datetime import timedelta
import eventlet
import eventlet.wsgi
import socketio
import asyncio
from threading import Thread
from flask import Flask, render_template
sio = socketio.Server()
app = Flask(__name__)
loop = asyncio.new_event_loop()
@app.route('/')
def main():
return render_template('main.html')
@sio.on('my-msg')
def handle_my_msg(sid, data):
loop.call_soon_threadsafe(handle_my_msg_async, (data,))
@asyncio.coroutine
def handle_my_msg_async(data):
print(str(data))
def run_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
if __name__ == '__main__':
loop_thread = Thread(target=run_loop, args=(loop,))
loop_thread.start()
app = socketio.Middleware(sio, app)
eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
В результате получаю ошибку:
TypeError: coroutines cannot be used with call_soon()
ЧЯДНТ?