Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
from fastapi.concurrency import run_in_threadpool
async def execute(data: DataRequest) -> DataResponse:
try:
result = await run_in_threadpool(sync_function, data)
return DataResponse(data=result)
except Exception as e:
return DataResponse(
error=str(e),
success=False,
)
В общем работает нормально. Для всех вызовов под капотом используется общий тредпул, всё работает предсказуемо.
Но потребовалось изменить количество запускаемых в пуле потоков (по умолчанию создается 40 воркеров).
Так как дело происходит с FastAPI, делается это через lifespan используя настройки anyio:
import anyio
@asynccontextmanager
async def lifespan(app: FastAPI):
limiter = anyio.to_thread.current_default_thread_limiter()
limiter.total_tokens = 100
yield
# если вдруг нужно вернуть обратно
limiter.total_tokens = 40
Зачем менять количество воркеров?
- уменьшить, если оперативки мало (один тред занимает ~8мб)
- увеличить чтобы выдержать нагрузку
Если есть предложения получше при тех же вводных - предлагайте😉
#async
🔴 MEETING EXCEPTIONNEL À LILLE !
Jean-Luc Mélenchon sera à #Lille ce jeudi au grand palais à 19h pour soutenir la liste insoumise, et surtout écologiste et populaire !
✊ Dimanche, nous pouvons l’emporter ! Soyons nombreux et nombreuses !
Ma publication à retrouver sur :
👉Twitter
👉Instagram
👉Facebook
👉Tik tok
➡️ Rejoignez le canal telegram : https://t.me/Lahouaria_Addouche
⚽️🇪🇺Champions
Lille 1-0 Real Madrid#Champions#Lille#RealMadrid
El Real Madrid cayó por primera vez en la temporada y segunda en el año. Desde el 18 de enero, en aquella noche copera del Metropolitano. Puede que el derbi dejase tocado al equipo de Ancelotti, que al menos en los últimos minutos pudo igualar un partido plano. Tres paradas de reflejos de Chevalier evitaron que el Madrid igualara en una reacción muy tardía. El Lille aprovechó los desajustes blancos y conquistó una victoria de enorme prestigio.
https://www.marca.com/futbol/champions-league/cronica/2024/10/02/66fda5bcca4741d9138b4572.html
🏆@Info288_deportes
⚽️🇪🇺Champions
Atlético 1-3 Lille#Champions#Atlético#Lille
El Atlético de Madrid ha perdido este miércoles por 1-3 frente al LOSC Lille en la jornada 3 de la fase de liga en la Champions League, a causa sobre todo de un polémico penalti encajado a cuarto de hora de la conclusión, en un partido disputado en el Riyadh Air Metropolitano y tras el cual los colchoneros se han complicado su futuro inmediato en este torneo.
https://www.europapress.es/deportes/futbol-00162/noticia-atletico-madrid-pierde-lille-complica-futuro-champions-league-20241023230223.html
🏆@Info288_deportes
Lille y Stade Brestois se clasificaron a la próxima edición de la UCL🇪🇺
El Lille llegaron hasta los octavos de final de la UCL en la temporada 21/22.
Mientras que el Brest jugará por primera la UCL en su historia tras una increíble temporada en la Ligue 1
@Fut_planet⚜️#UCL🇪🇺#Lille🇫🇷
#Brest🇫🇷
France Ligue 1🇫🇷
2026-05-03 13:00 UTC
Lille vs. Le Havre
Predicted outcome: Lille❌
Predicted score: 1:0
Actual: Draw 1:1
#Lille#LEHavre
2026-05-03 15:15 UTC
Strasbourg vs. Toulouse
Predicted outcome: Strasbourg❌
Predicted score: 2:1
Actual: Toulouse 1:2
#Strasbourg#Toulouse
2026-05-03 15:15 UTC
Auxerre vs. Angers
Predicted outcome: Auxerre✅
Predicted score: 2:1
Actual: Auxerre 3:1
#Auxerre#Angers
2026-05-03 15:15 UTC
Paris FC vs. Stade Brestois 29
Predicted outcome: Paris FC✅
Predicted score: 2:1
Actual: Paris FC 4:0
#ParisFC#StadeBrestois29
2026-05-03 18:45 UTC
Lyon vs. Rennes
Predicted outcome: Lyon✅
Predicted score: 3:2
Actual: Lyon 4:2
#Lyon#Rennes
#Football#FranceLigue1