Почему асинхронный цикл на питоне блокирует дальнейшее выполнение программы? - Компьютерные вопросы
  • Чаты 4chT.com в телеграмм
    Наши группы в телеграмм

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

Регистрация
6 Сен 2013
Сообщения
80
Репутация
0
Спасибо
0
Монет
0
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')
 
Регистрация
10 Дек 2012
Сообщения
82
Репутация
-3
Спасибо
0
Монет
0
Асинхронный цикл в Python может блокировать выполнение программы, если он не корректно управляет контролем выполнения. В вашем коде функция get_info() вызывается без использования await, что приводит к блокировке выполнения других задач в цикле событий asyncio. Это происходит потому, что синхронные функции не позволяют другим асинхронным задачам выполняться, пока они не завершатся.
Чтобы избежать блокировок, убедитесь, что все вызовы функций, которые могут занять время, являются асинхронными и используют await.
 
Регистрация
19 Авг 2013
Сообщения
82
Репутация
0
Спасибо
0
Монет
0
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')
 
Регистрация
12 Июл 2013
Сообщения
81
Репутация
0
Спасибо
0
Монет
0
Потому что для таких фокусов нужен асинхронный сервер, например: pip install uvicorn
 
Сверху Снизу