Недавно делал быстрый прототип асинхронного приложения в котором требовалось вызывать много синхронного кода. Да, я знаю, что это не лучший дизайн, но нужно было быстрое решение на один процесс и без очередей. Поэтому я выполнял код в потоках.
Выглядело это примерно так:
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
🎬 Победитель недели в креативном видеоконкурсе!
Поздравляем единственного автора, чье видео прошло все условия отбора на прошлой неделе! 🏆
Победитель:
• UID: e12wi3q
• Платформа: YouTube
🎯 Конкурс продолжается до 30 ноября!
Успей снять и загрузить свое видео по игре «Тотал Футбол» с хештегами #ТоталФутбол#TotalFootball
Полные правила и условия участия:
👉https://t.me/totalfootball_official/290
Твой контент — твой шанс на победу! 🚀
🎬 Победитель недели в креативном видеоконкурсе!
Поздравляем единственного автора, чье видео прошло все условия отбора на прошлой неделе! 🏆
Победитель:
• UID: e127g64
• Платформа: TikTok
@iammaxim_s
🎯 Конкурс продолжается до 30 ноября!
Успей снять и загрузить свое видео по игре «Тотал Футбол» с хештегами #ТоталФутбол#TotalFootball
Полные правила и условия участия:
👉https://t.me/totalfootball_official/290
Твой контент — твой шанс на победу! 🚀
⚽️Голы! Сэйвы! Хайлайты недавнего стрима уже готовы!🚀
🔥Готовьте попкорн: самые эпичные моменты стрима уже здесь!
Спасибо всем участникам — вы так эффектно обыграли Амкал, что ребята до сих пор в себя прийти не могут! 😂🎉
#totalfootball#amkalfc
Ажиотаж вокруг Тотал Футбол X РПЛ на форуме «Россия — Спортивная Держава»! 🔥
Вокруг Тотал Футбол не протолкнуться — представители ведущих СМИ, футбольных клубов и спортивных федераций собрались возле нас, чтобы самим испытать игру в действии! 📹⚽️
Быть в центре внимания всей спортивной России — это огромная честь для нас! ❤️
Смотрите, как это было, и прочувствуйте энергию события! ⬇️
А вы уже видели этот хайп? Ставьте лайк, если гордитесь нашей общей работой! 🔥
#TotalFootball#РоссияСпортивнаяДержава#RPL
Мы тут на Международном спортивном форуме «Россия — спортивная держава», и легенды Российской Премьер-Лиги (РПЛ) вживую пробуют Тотал Футбол! 💪⚽️
Видели бы вы, с каким азартом они зажигают в игре! 🔥
А теперь главный вопрос: Угадайте, игроки какого клуба сейчас у нас в гостях? 👀
Варианты:
🥅 Зенит
⚽️ Спартак
❤️ ЦСКА
😄 Крылья Советов
🔥 Динамо Mахачкала
Пишите свои ответы в комментариях! 👇 Самых догадливых ждёт крутая награда!
🎁Наград: Агентский Контракт x1000, Карта Усиления I x3, ЕВРОx50000
#TotalFootball#RPL#РПЛ#РоссияСпортивнаяДержава
🔥Конкурс прогнозов уже здесь!
Угадайте хотя бы один из пунктов:
⚽️ исход матча
⚽️ общее количество голов
⚽️ общее количество жёлтых карточек
За правильный прогноз — получите набор【83+】Игрок года ×1 и 1000 агентских контрактов ⚽️
🤩Если никто не угадает — случайным образом выберем 10 участников и подарим ресурсные наборы!
#ЛигаЕвропы#Финал#TotalFootball#ТоталФутбол
✍️Ждём ваши прогнозы в комментария