LINUX.ORG.RU

История изменений

Исправление 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()

ЧЯДНТ?