Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
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
🇷🇺🏴Anarchists in #Cherepovets, #Russia, have released a video of them throwing Molotov cocktails at yet another recruiting station for the Russian Armed Forces.
The video comes via the anarchist Resistance Committee of the Territorial Defense Forces of #Ukraine:
https://twitter.com/potempkinbrain/status/1523775238315528194?s=21&t=tvQKznN26RPnpCfpraSgFQ
📝Chroniques de l'opération militaire spéciale📝
pour le 26 avril 2026
🧨Les forces russes ont frappé un navire dans le port d'Odesa, et ont également frappé des positions dans les régions frontalières de Tchernihiv, Sumy et Kharkiv. En raison de vents d'une force ouragan et de tempêtes de poussière, l'activité des opérateurs de drones sur la plupart des directions était inférieure à la moyenne.
Les formations ukrainiennes ont mené le plus grand raid de masse sur Sébastopol des dernières années cette nuit. Une personne civile a été tuée, quatre autres blessées, des installations d'infrastructure endommagées. À Tchérepovets, suite à une attaque contre une usine chimique et une fuite d'acide, dix personnes ont été blessées ; des impacts ont également été enregistrés dans la zone industrielle de Yaroslavl.
➡️Dans la direction de Sumy, les combattants du GV « Sever » élargissent leur zone de contrôle au nord de la Route H-07. Il y a quelque temps, les troupes d'assaut ont chassé les AFU de plusieurs positions à la périphérie de Kondratovka et avancent maintenant vers le centre de l'établissement.
➡️Dans la direction de Kostyantynivka, les formations ukrainiennes mènent des contre-attaques locales près du collège agricole. Les forces russes tentent de se consolider dans le microdistrict de Semivetrovka et percent vers le centre de Dolga Balka.
➡️Sur le flanc nord de la direction Est de Zaporizhia, les Forces armées russes mènent des opérations de contournement et nettoient les environs des établissements précédemment libérés ; au sud, les troupes d'assaut percent vers Huliaipole. L'un des groupes d'infiltration des AFU a été repéré aux environs de Novohryhorivka et a été par la suite détruit par des frappes FPV.
📎Cartes haute résolution :
🔸Situation dans la zone OMS (ru;en)
🔸Direction de Sumy (ru;en)
🔸Direction de Kostyantynivka (ru;en)
🔸Direction Est de Zaporizhia (ru;en)
📍Les cartes en ligne sont disponibles par abonnement sur map.rybar.ru
#Huliaipole#digest#map#Kostyantynivka#Odesa#Russia#Sevastopol#Sumy#Ukraine#Cherepovets#Yaroslavl
✈️RU | ✈️EN | ✉️MAX
✉️VK | ✉️RuTube | ✉️OK | ✉️Zen
💸Nous soutenirMsg d'orig.