Top.Mail.Ru
Ответы

Почему асинхронный цикл на питоне блокирует дальнейшее выполнение программы?

12345678910111213141516171819202122232425262728
 async def cycle(): 
    while True: 
        try: 
            get_info() 
            await asyncio.sleep(60) 
        except Exception as e: 
            print(f"Ошибка цикла: {e}") 
 
 
if __name__ == '__main__': 
    from flask import Flask, jsonify, render_template, abort, request 
 
    app = Flask(__name__) 
 
 
    @app.route('/crypto_info') 
    def top_status(): 
        return get_info() 
 
 
    # asyncio.create_task(cycle())  # Запускаем цикл как отдельный таск 
 
    @app.route('/') 
    def index(): 
        return render_template('index.html')  # Используйте render_template 
 
 
    app.run(debug=False, host='0.0.0.0') 
Дополнен

Запуск цикла раскоментирован, просто ответы только один раз дают редактировать вопрос.

По дате
По рейтингу
Аватар пользователя
Мыслитель
1234567891011121314151617181920212223242526272829303132333435
 import asyncio 
from threading import Thread 
from flask import Flask, render_template 
 
app = Flask(__name__) 
 
async def cycle(): 
    while True: 
        try: 
            get_info() 
            await asyncio.sleep(60) 
        except Exception as e: 
            print(f"Ошибка цикла: {e}") 
 
def start_async_loop(loop): 
    asyncio.set_event_loop(loop) 
    loop.run_forever() 
 
if __name__ == '__main__': 
    loop = asyncio.new_event_loop() 
    t = Thread(target=start_async_loop, args=(loop,)) 
    t.start() 
 
    asyncio.run_coroutine_threadsafe(cycle(), loop) 
 
    @app.route('/info') 
    def top_status(): 
        return get_info() 
 
    @app.route('/') 
    def index(): 
        return render_template('index.html') 
 
    app.run(debug=False, host='0.0.0.0') 
 
Аватар пользователя
Мудрец

Огромная благодарность!!! А почему ассинхрон так сложно заводиться на питоне? На JS к примеру это без танцев делается просто добавлением перед функцией async. А тут целое шаманство.

Аватар пользователя
Ученик

Потому что для таких фокусов нужен асинхронный сервер, например: pip install uvicorn

Аватар пользователя
Мастер

Асинхронный цикл в Python может блокировать выполнение программы, если он не корректно управляет контролем выполнения. В вашем коде функция get_info() вызывается без использования await, что приводит к блокировке выполнения других задач в цикле событий asyncio. Это происходит потому, что синхронные функции не позволяют другим асинхронным задачам выполняться, пока они не завершатся.
Чтобы избежать блокировок, убедитесь, что все вызовы функций, которые могут занять время, являются асинхронными и используют await.

Аватар пользователя
Ученик

Еще мне говорят что я вопросы странные задаю

Аватар пользователя
Ученик

фурри



Видео по теме