RuntimeError: вы не можете использовать AsyncToSync в том же потоке, что и асинхронный цикл событий.Python

Программы на Python
Ответить
Anonymous
 RuntimeError: вы не можете использовать AsyncToSync в том же потоке, что и асинхронный цикл событий.

Сообщение Anonymous »

Я создаю панель мониторинга на Python, используя flask.
Необходимо выполнить три задачи: flask, datastream_handler() и Dashboard_handler(). Одна из этих задач, datastream_handler(), должна быть асинхронной функцией.
Я использовал многопоточность, чтобы позволить задачам выполняться одновременно (flask и Dashboard_handler() являются потоками, datastream_handler() запускается из основного потока).

Код: Выделить всё

dashboard_handler()
и datastream_handler() запускаются и работают отлично, и кажется, что flask запускается, но когда я посещаю веб-страницу, в терминале выдается ошибка:

Код: Выделить всё

RuntimeError: You cannot use AsyncToSync in the same thread as an async event loop - just await the async function directly.
Я в замешательстве, потому что я ожидал напрямую асинхронную функцию (datastream_handler)?
Я пробовал ее переключить так что flask является основным потоком, а datastream_handler() запускается как threading.Thread (с использованием asyncio.run для запуска асинхронной функции из неасинхронной функции). Однако это привело к той же ошибке.
Я искал эту ошибку, и у нескольких человек была такая же ошибка с Django и Requests-html, но их выводы были специфичны для их соответствующей платформы. и не удалось применить к flask.
Вот мой код:

Код: Выделить всё

datastream_handler
и Dashboard_handler находятся в разных файлах;

Код: Выделить всё

dashboard_handler
— это обычная синхронная функция с циклом while и datastream_handler. — это асинхронная функция, которая в настоящее время содержит только цикл while с print и asyncio.sleep для целей тестирования.
Я не думаю, что содержимое этих функций вызывает ошибки, но поправьте меня, если я ошибаюсь

Код: Выделить всё

app = Flask(__name__)
socket = SocketIO(app)

@app.route("/")
async def index():
return render_template("index.html")

def start_flask():
socket.run(app, host="0.0.0.0", port=5000)

async def main():

q = Queue() #queue for data transfer
threading.Thread(target=dashboard_handler, args=(q,), daemon=True).start()
threading.Thread(target=start_flask, daemon=True).start()

await datastream_handler(q)

if __name__ == "__main__":
asyncio.run(main())
Если кто-нибудь сможет помочь, буду очень благодарен
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/721 ... c-event-lo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»